7

在 C# 3.0 中,您可以将 null 分配给 int? 类型(在 CLR int? 中是一个结构):

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;
4

3 回答 3

20

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

MyStruct? a = null;

null只能隐式转换为可空类型,这意味着任何引用类型或任何可空值类型 - 其中后者意味着Nullable<T>some T

请注意,这种转换能力null实际上是一种语言特性——编译器正在转换它:

int? a = null;

进入

int? a = new int?();

它们的意思是一样的——基本上,可空值类型的“空”值是一个值为假的值HasValue,默认情况下它是假的。它与空引用不同——尽管像这样对空值进行装箱导致空引用。

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

于 2010-11-24T18:13:02.467 回答
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);

}
于 2010-11-24T18:14:00.010 回答
1

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

在符号上,正如 int 实际上是 Int32,而不是任何 int,?符号表示可以为空。可以为空,在这种情况下。

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

于 2010-11-24T18:14:42.397 回答