2013-05-06 37 views
2

将整数赋值给double是非常合法的。为什么将整数分配给Double Attached Properties会产生错误?

如果我们能做到

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); 
    } 

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

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

enter image description here

在上面的代码我new FrameworkPropertyMetadata(0)意外分配0和代码运行成功。

但我的印象是,你可以指定一个精度较低的数据类型(即整数)到一个具有更高精度的数据类型(即0.0双精度)?

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

+0

你可能认为这是,但这不是。您必须分配预期的类型。如果是“双”,则分配3。0或(双)3。 – 2013-05-06 12:12:12

+0

@ bash.d:我知道这是为什么。将整数赋值为double是合法的。 – 2013-05-06 12:14:14

+1

我经常遇到这个错误,所以我最终编辑了我的依赖和附加属性的代码片段,以便默认值始终是'default($ type $)'... – 2013-05-06 12:23:18

回答

3

这是因为boxing

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

这里是一个能说明问题的例子:

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,所以它不能使用内置的转换;它所能做的就是取消开发者指定的类型的值。

4

你没有做(简单)分配。默认值存储为引用(boxed int),随后该属性尝试获取默认值作为指定类型(double)。总之,这个代码是等价的:

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

解决方法当然是简单的:

object x = 1.0;  // boxed double 
double d = (double)x; // OK 
相关问题