几天前,当我编写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?
答案 0 :(得分:6)
当我重载方法时,我得到你引用的错误,编译器无法解析在编译时调用哪个方法。是吗?
答案 1 :(得分:5)
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
true
和object
(null
)。
现在编译器不知道如何处理这个问题,因为三元运算符需要返回相同类型的值。因此,您需要为null
值指定所需的“类型”。
很抱歉,如果这不是一个非常深刻的技术解释 - 我确信有人可以更好地阐述这一点,但它可能有助于更好地理解这一点。