9

本来我有这样的印象,NULL是引用类型,因为它是赋值给引用的,后来又遇到了一个叫可空值类型的概念,这让我的理论陷入了尴尬的境地,那么NULL值类型到底是不是引用类型呢?

4

6 回答 6

21

C# 规范在这一点上很清楚:null关键字表示没有 type 的表达式。它既不是引用类型,也不是值类型,也不是指针类型。但是,该表达式可以转换为所有这些类型。没有要求编译器将所有表达式分类为具有类型,事实上它没有。

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

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

  • 同样,空指针的类型也不是任何东西;空指针值不指向任何东西。如果你有一张纸,上面写着地址 1600 Pennsylvania Avenue,你可以问“这个地址的房子是什么颜色”,得到答案:白色。如果你有一张空白的纸,问那个地址的房子是什么颜色并不能得到任何有用的答案。

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

于 2013-07-16T03:45:58.593 回答
9

null不是一种类型。

来自msdn

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

可空类型Nullable<T>结构的实例,它“表示可以分配为空的值类型。

于 2013-07-16T03:02:39.177 回答
1

两者都不。nulldefault引用类型的值,但它本身没有类型。

可空值类型实际上是作为值类型本身实现的——与null.

于 2013-07-16T03:02:04.290 回答
1

nullC# 中本身没有类型,正如这里已经说过的那样。我认为其他答案中缺少一些显示该定义含义的精确示例。

变种东西=空;

是无效的

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 - 以下方法或属性之间的调用不明确:“myMethod(string)”和“myMethod(int?)”

于 2017-09-06T11:20:12.447 回答
0

null 不引用任何内容。它只是一个类型指向什么。你们通常使用它来取消引用对象。

于 2013-07-16T03:04:12.713 回答
-1

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

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

例如:

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

被编译器替换为:

int? i;
if (!i.HasVaue)
   i = 1;
于 2013-07-16T03:05:33.203 回答