2010-02-12 77 views
0

我们可以给结构类型的变量分配空值吗?C#中的可空类型转换?

struct MyStruct 
{ 
} 

MyStruct var = null; 

这是可能的在C#.net?

如果不是?那么C#如何允许Nullable < T> struct类型的变量可以分配为空?

+0

甚至提出7个问题,他还没有学会如何使用格式化后。 – Shoban 2010-02-12 09:06:02

+0

hello可空是结构类型complier如何接受null为这种类型?为什么不接受相同的结构类型的变量? – dinesh 2010-02-12 09:32:35

回答

0

对主题:

... C#如何允许Nullable < T>变量的结构类型可以分配为空?

答案其实很简单:C#编译器知道Nullable<T>并将其作为特殊情况处理以维持错觉。

例如,这样的:

int? a; 
if (a != null) ... 

实际上编译成这样:

if (a.HasValue) ... 

几乎所有的这个魔法是由编译器处理 - .NET将主要观点Nullable<T>只是另一种值类型。我记得阅读(最有可能从Eric Lippert's blog),在开发过程的后期,他们发现了一个单独的编译器技巧无法处理的边缘问题。运营团队同意做出一个处理Nullable<T>作为特例的更改。不幸的是,我不记得什么特殊情况,我找不到参考了。

请查看这篇文章的详细信息(尤其是第二个评论这是利珀特): http://blogs.msdn.com/ericlippert/archive/2008/05/07/covariance-and-contravariance-part-twelve-to-infinity-but-not-beyond.aspx

7

是的,这是可能的,但你必须声明你的变量为“可空”:

MyStruct? foo = null; 

Nullable<MyStruct> foo = null; 
+0

hello可空是结构类型complier如何为此类型接受null? 为什么不接受相同的结构类型的变量? – dinesh 2010-02-12 09:22:44

+0

@dinesh。事实上,编译器不能接受null为非空类型。可空是由它自己的类型。它用一些模拟null行为的代码逻辑来修饰内部非空类型;通过提供一些属性(HasValue,Value)和一些隐式转换运算符。 – 2010-02-12 09:28:00

0

的Structs不能为空,Nullable Types用于创建可空结构的情况下, 。

2

在C#中,struct s是值类型,而class es是引用类型。

struct s不能被制作null,所以你必须使用Nullable<T>类将它包装成可以无效的东西。

这是通过直接使用在声明中Nullable<T>类完成:

Nullable<MyStruct> foo; 

或者通过使用Nullable<T>的语法糖:

MyStruct? foo; 
+0

hello可空是结构类型complier如何接受null为这种类型?为什么不接受相同的结构类型的变量? – dinesh 2010-02-12 12:59:28