C#null - 它是一个对象

时间:2011-06-03 10:17:49

标签: c# language-agnostic null

几天前,当我编写C#代码时,我注意到编译器抱怨我必须将null强制转换为特定对象。

这是否意味着null只是该类型的未实例化版本?或者它是像Java一样的Null类的单例值(即使它具有特殊权限)?

编辑:提供错误的代码示例如下:

public String duplicate(String toDuplicate)
{
    return toDuplicate + toDuplicate;
}

public String duplicate(int? toDuplicate)
{
    String asString = toDuplicate.toString();

    return asString + asString;
}

public static int Main(string[] args)
{
    //This needs to be cast:
    duplicate(null);
    //To:
    duplicate((string)null);
}

我在Java中对null发表评论的原因是在阅读之后:

  

还有一个特殊的null类型   表达式的类型为null,具有   无名。因为null类型没有   名字,不可能申报   null类型的变量或者要转换   到null类型。空引用   是唯一可能的价值   null类型的表达式。 null   引用总是可以转换为任何引用   参考类型。在实践中,   程序员可以忽略null类型   并假装null只是一个   可以是任何特殊文字   参考类型。

在此处找到:Is null an Object?

6 个答案:

答案 0 :(得分:6)

当我重载方法时,我得到你引用的错误,编译器无法解析在编译时调用哪个方法。是吗?

答案 1 :(得分:5)

根据MSDN description

  

null关键字是一个表示空引用的文字,一个不引用任何对象的引用。 null是引用类型变量的默认值。普通值类型不能为空。但是,C#2.0引入了可空值类型。

答案 2 :(得分:1)

null是任何类型的“未经证实的参考”。这不是一个价值。 null没有已定义的类型。

答案 3 :(得分:1)

不,它不是一个对象。 null是引用类型变量的默认值。普通值类型不能为空。但还有另一套名为nullable类型。

答案 4 :(得分:1)

否 - null只是空引用的文字。

你需要以这种方式“强制转换”它的原因(我把单词cast放在引号中,因为你实际上并没有构建任何实例),纯粹是为了帮助编译器解决你调用的方法的重载,或者你调用的方法甚至存在。

在您的示例中,您需要指定您正在调用带有单个字符串参数的方法“duplicate”。如果你省略了强制转换,那么编译器只知道你打算调用的方法被称为“重复”并且只有一个参数,但不能告诉参数是什么类型 - 你是不是要调用duplicate(string)或者你的意思是打电话给duplicate(some other type)?它应该编译,还是错误地告诉你你试图调用的方法不存在?

如果你定义了重复的(byte []),你也会遇到同样的问题,因为现在你的调用没有明确的强制转换是不明确的。

答案 5 :(得分:1)

您可能是指以下事实导致编译器错误:

int? nullableInt = (somecondition) ? value : null;

确实你需要在这里添加一个演员:

int? nullableInt = (somecondition) ? value : (int?)null;

即使我无法详细解释这一点,我仍怀疑以下内容:

int?实际上是Nullable<int>的简短形式,因此它基本上是一个对象实例。将int值分配给nullableInt时,将在内部设置Nullable<int>的属性。直接分配null也没关系。

然而,条件赋值会返回两种不同的类型:int以及somecondition trueobjectnull)。

现在编译器不知道如何处理这个问题,因为三元运算符需要返回相同类型的值。因此,您需要为null值指定所需的“类型”。

很抱歉,如果这不是一个非常深刻的技术解释 - 我确信有人可以更好地阐述这一点,但它可能有助于更好地理解这一点。