2

将 Integer 分配给 double 是非常合法的。

如果我们能做到

double d = 3;

d 被分配3.0

但为什么这在附加属性中失败了?

设想

我创建了一个附加属性

public static readonly DependencyProperty ActualWidthBeforeHidingProperty = 
       DependencyProperty.RegisterAttached("ActualWidthBeforeHiding", 
       typeof(double), typeof(MainWindow), new FrameworkPropertyMetadata(0));

public static double GetActualWidthBeforeHiding(DependencyObject element)
    {
        if (element == null)
        {
            throw new ArgumentNullException("element");
        }

        return Convert.ToDouble(element.GetValue(ActualWidthBeforeHidingProperty));
    }

public static void SetActualWidthBeforeHiding(DependencyObject element, double value)
    {
        if (element == null)
        {
            throw new ArgumentNullException("element");
        }

        element.SetValue(ActualWidthBeforeHidingProperty, value);
    }

我编译了代码。没有编译时错误。

但是当我尝试运行应用程序时,它给出了错误

在此处输入图像描述

在上面的代码中我不小心分配了 0new FrameworkPropertyMetadata(0)并且代码运行成功。

但我的印象是,您可以将精度较低的 DataType(即 Integer)分配给精度较高的 DataType(即 0.0 Double)?

那么为什么会偏离依赖属性的基本编程概念呢?

4

2 回答 2

4

你没有做一个(简单的)作业。默认值存储为引用(boxed int),稍后该属性尝试将默认值作为指定类型(双精度)。简而言之,这段代码是等价的:

 object x = 1;          // boxed int
 double d = (double)x;  // InvalidCast exception

解决方案当然很简单:

 object x = 1.0;        // boxed double
 double d = (double)x;  // OK
于 2013-05-06T12:16:27.553 回答
3

这是因为拳击

构造函数的参数FrameworkPropertyMetadata被声明为object,所以当你这样做时new FrameworkPropertyMetadata(0),整数值0被装箱为一个object(因为int是一个值类型)。当 WPF 尝试使用此默认值时,它会尝试将其拆箱为 a double(因为该属性被声明为double),但由于装箱后的值是 aint而不是 a ,因此失败double装箱值只能拆箱为其实际类型,通常的隐式数字转换(如intto double)在这种情况下不起作用。

这是一个说明问题的示例:

int i = 42;
double d1 = i; // Works fine, uses the built-in conversion from int to double
object o = i; // boxing
double d2 = (double)o; // Fails: unboxing to the wrong type

编译器并不静态知道该对象实际上是一个装箱的 int,因此它不能使用内置转换;它所能做的就是将值拆箱为开发人员指定的类型。

于 2013-05-06T12:14:56.607 回答