在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;
答案 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