为什么某些Silverlight对象不能为Nullable<>类型?

时间:2010-08-29 15:32:02

标签: c# nullable

显然,您无法在Silverlight中拥有 Nullable< Rectangle> 。我想知道为什么没有技术原因以及可能适用的对象数量?

今天我在说明“Rectangle”类型不是Nullable类型后意外地开始了一个小comment flamewar。那就是你不能有“ Nullable< Rectangle> ”或“矩形?

我的错误在于仅在Silverlight中测试它,并假设Silverlight System.Windows.Shapes.Rectangle的行为转移到.Net中的System.Drawing.Rectangle类型。对我感到羞耻。我已经删除了我的评论,因为它们没有为Stack Overflow添加任何值。

如果有人能够完全回答这个问题,我们将不胜感激。

2 个答案:

答案 0 :(得分:9)

Nullable<T>只能与值类型或结构一起使用,System.Windows.Shapes.Rectangle是引用类型或类。您不需要使用Nullable<T>,因为您已经可以为System.Windows.Shapes.Rectangle类型的变量分配空引用:

System.Windows.Shapes.Rectangle rect = null;

相比之下,System.Drawing.Rectangle是一个值类型,因此它的值不能为null。默认值是全零的矩形。

System.Drawing.Rectangle rect = null; // Does not compile
System.Drawing.Rectangle rect = 
    default(System.Drawing.Rectangle); // All fields are zero

答案 1 :(得分:0)

更好的答案是考虑Option类型和Nullable类型之间的差异,这在ECMA泛型公共语言基础结构标准中偶然涉及。

已经为StackOverflow上的F#提供了great explanation of this

所以你不想要Nullable&lt; Rectangle&gt;。您需要一个选项&lt; Rectangle&gt;。

请参阅MSDN文档:Core.Option Module (F#)