C#值类型初始化为null

时间:2010-11-24 18:11:26

标签: c# .net null nullable value-type

在C#3.0中你可以为int分配null吗? type(在CLR int?中是一个struct):

int? a = null;

但是在定义自定义结构时:

struct MyStruct
{

}

编译此代码时出错:

MyStruct a = null;

错误如下:

Cannot convert null to 'Example.MyStruct' because it is a non-nullable value type

虽然是int?是CLR中的结构,它在某种程度上违反直觉,我们可以为它分配null。 我想null被隐式地转换或装箱到certian int?表示空值的值。它是如何完成的?如何以可以执行该行的方式扩展MyStruct:

MyStruct a = null;

3 个答案:

答案 0 :(得分:20)

这是因为int?实际上是速记Nullable<int>。你也可以为你的类型做同样的事情:

MyStruct? a = null;

null只能隐式转换为 nullable 类型,这意味着任何引用类型或任何可为空的值类型 - 后者对于某些{{1}意味着Nullable<T> }}

请注意,这种从T转换的功能实际上是语言功能 - 编译器正在转换它:

null

int? a = null;

它们的意思相同 - 基本上,可空值类型的“null”值是int? a = new int?(); 为false的值,默认情况下为false。它与null 引用不同 - 虽然像那样装箱空值会导致空引用。

(这是跨越语言,库和CLR边界的功能的一个示例。库部分非常简单,CLR部分仅与装箱和拆箱有关 - 但是在提升的操作员等方面有很多在语言中。)

答案 1 :(得分:2)

结构是C#中的值类型,而不是引用类型,因此它们不能为空。

MyStruct? = null;

会起作用,但请记住结构是不可变的,例如:

public struct Point 
{
   public int x, y;

   public Point(int p1, int p2) 
   {
       x = p1;
       y = p2;    
   }
}

void Main()
{

    //create a point
    var point1 = new Point(10, 10); 

    //assign point2 to point, point2
    var point2 = point1; 

    //change the value of point2.x
    point2.x = 20; 

    //you will notice that point1.x does not change
    //this is because point2 is set by value, not reference.
    Console.WriteLine(point1.x);
    Console.WriteLine(point2.x);

}

答案 2 :(得分:1)

只需添加,可以为空的类型可以表示其基础值类型的正常值范围,以及一个额外的空值。

在表示法中,就像int实际上是Int32,而不是任何int,?标志意味着可空。 在这种情况下,可以为Nullable。

http://msdn.microsoft.com/en-us/library/1t3y8s4s%28VS.80%29.aspx