在c#值类型或引用类型中为null

时间:2013-07-16 02:55:20

标签: c# null

最初我有这样的印象,即NULL是引用类型,因为它被赋值给引用,然后遇到这个被称为可空值类型的概念,这使得我的理论处于尴尬的境地,所以地球上的引用类型是NULL值类型吗? / p>

6 个答案:

答案 0 :(得分:16)

此时C#规范很明确:null关键字代表表达式,没有类型。它既不是引用类型,也不是值类型,也不是指针类型。但是,该表达式是 convertible 到所有这些类型。没有要求编译器将所有表达式分类为具有类型,实际上它没有。

现在您可以在运行时询问 什么是空引用的类型,可空值类型的空值的类型是什么,以及空指针的类型是什么。答案是:

  • 空引用没有类型。如果你有一个可以装巧克力的盒子,那么问这个空盒子里的巧克力是什么牌子是毫无意义的。“缺少的巧克力没有品牌; null引用没有类型。

  • 类似地,空指针的类型也不是任何东西;空指针值不指向任何内容。如果你有一张地址为1600宾夕法尼亚大道的纸,你可以问“这个地址的房子颜色是什么”,并得到答案:白色。如果你有一张白纸,询问那个地址的房子颜色是什么,不能得到任何有用的答案。

  • 可空值类型的空值是可以为空的值类型的值。

答案 1 :(得分:9)

null不是一种类型。

来自msdn

  

null关键字是表示空引用的文字,不引用任何对象。

Nullable typesNullable<T>结构的实例,“表示可以赋值为null的值类型。

答案 2 :(得分:1)

都不是。 null是引用类型的default值,但它本身没有类型。

Nullable值类型实际上是作为值类型本身实现的 - 与null相比,只有编译器和库技巧可以使它们按预期运行。

答案 3 :(得分:1)

null在C#中没有自己的类型,就像这里已经说过的那样。我认为其他答案中缺少一些显示这一定义含义的精确例子。

var something = null;

无效

string a = null; // valid. Null is implicitely casted to string.
int? b = null; // valid. Null is implicitely casted to Nullable<int>.
var c = "hello" // valid, type of c is infered by the compiler by looking at the right side of the expression.

var d = null; // not valid, compiler can't infer any type from null !

上例中的无效行将导致以下编译错误:

  

错误 - CS0815 - 无法分配隐式类型变量

还有:

将null传递给重载方法可能需要显式转换

void myMethod(int? myParam) { }
void myMethod(string myParam) { }

void test 
{
    string a = null;
    myMethod(a); // no problem here, a is of type string so 2nd overload will be used.

    myMethod(null); // not valid ! Compiler can't guess which one you want.

    myMethod((string) null); // valid, null is casted to string so 2nd overload is to be used.
}

上例中的无效行将导致以下编译错误:

  

错误 - CS0121 - 以下方法之间的调用不明确   或属性:&#39; myMethod(string)&#39;和&#39; myMethod(int?)&#39;

答案 4 :(得分:0)

null不引用任何内容。这只是一种无所事事的类型。你们通常用它来取消引用一个对象。

答案 5 :(得分:-1)

C#中的null关键字确实表示空引用,因此您可以将其视为引用类型(虽然从技术上讲它表示不是类型)。

C#编译器和null的额外处理,用于可空类型。可以为Nullable的值类型和值类型,实际上永远不会是null。将Nullable值类型分配或比较为null时,编译器将替换代码。

例如:

int? i;
if (i == null)
    i = 1;

由编译器替换为:

int? i;
if (!i.HasVaue)
   i = 1;