C#中的可空类型转换?

时间:2010-02-12 09:02:41

标签: c#-3.0

我们可以将null值赋给变量的struct类型吗?

struct MyStruct
{
}

MyStruct var = null;

这可以在C#.net?

中使用

如果没有?然后C#如何允许Nullable< T>结构类型的变量可以指定为null吗?

4 个答案:

答案 0 :(得分:7)

是的,这是可能的,但你必须将你的变量声明为'nullable':

MyStruct? foo = null;

Nullable<MyStruct> foo = null;

答案 1 :(得分:2)

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

struct无法成为null,因此您必须使用Nullable<T>类将其包装成可以无效的内容。

这可以通过直接使用声明中的Nullable<T>类来完成:

Nullable<MyStruct> foo;

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

MyStruct? foo;

答案 2 :(得分:0)

结构不能为空,Nullable Types用于创建可为空结构的实例。

答案 3 :(得分:0)

关于以下问题:

  

...... C#如何允许Nullable&lt; T>结构类型的变量可以指定为null吗?

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

例如,这个:

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

实际上汇编成这个:

if (a.HasValue) ...

几乎所有这些魔法都由编译器处理 - .NET主要将Nullable<T>视为另一个ValueType。我记得阅读(最有可能来自Eric Lippert's blog),在开发过程的后期,他们发现了一个边缘问题,而单独的编译器技巧无法解决这个问题。运行时人员同意进行一次更改,将Nullable<T>视为特例。不幸的是,我不记得特殊情况是什么,我再也找不到参考。

请查看本文了解详情(尤其是Lippert的第二条评论): http://blogs.msdn.com/ericlippert/archive/2008/05/07/covariance-and-contravariance-part-twelve-to-infinity-but-not-beyond.aspx