null和(type)null之间有什么区别?

4

注意:这不是一个重复的问题。 这个问题 问的是为什么可以将 null 强制转换成其他类型,我的问题是 null(type)null 之间有什么区别。


此参考文献(来自 MSDN C# 参考)中,它说这段代码:

expression as type 

等同于这段代码(“只是 expression 变量仅被评估一次”):

expression is type ? (type)expression : (type)null  

这让我想到了,null强制转换的意义何在?与以下代码有何不同:

expression is type ? (type)expression : null  

谢谢!


可能是将空值转换为类型的重复问题。 - Renatas M.
2
文档说明中指出,“代码等同于”关键字为“equivalent”。您可以删除强制转换,结果仍然与“expression as type”等效,但为什么要提及每个可能的功能等效性呢? - Igor
null 可以是任何类型。但是如果您想要一个空字符串,您必须将 null 强制转换为 string。如果您将表达式分配给 var x,则编译器不知道 x 应该是哪种类型,如果分配结果为 null。 因此需要进行强制转换。 - Emaro
@Reniuz - 请审查我的编辑。 - Michael Haddad
在这个问题中的三元运算符情况下,这种情况并不重要,因为null可以安全地转换为任何特定的引用类型。 - Lasse V. Karlsen
显示剩余4条评论
2个回答

4

看看这个示例项目:

static void Main(string[] args)
{
    //Error: The call is ambigious between the following methods or properties: ShowMessage(FirstClass), ShowMessage(SecondClass)
    ShowMessage(null);
    //Here it is known which type is being used
    ShowMessage((FirstClass)null);
}

private static void ShowMessage(FirstClass value)
{
    System.Console.WriteLine(value);
}

private static void ShowMessage(SecondClass value)
{
    System.Console.WriteLine(value.ToString());
}

class FirstClass { }
class SecondClass { }

因此,null(FirstClass)null不是一样的。使用(FirstClass)null可以明确地将其定义为可空类型FirstClass(因为class是引用类型),它的值为null。而另一个null只是...嗯,就是null,必须隐式转换为所需的可空类型。
请注意: 如果你替换掉其中的null,则必须根据需要显式或隐式地进行类型转换。
ShowMessage(NotFirstClassObj as FirstClass)

使用

ShowMessage(NotFirstClassObj is Firstclass ? (FirstClass)NotFirstClassObj : null)

仍然有效是因为编译器仍然可以推断出正确的类型。但这可能是记录中为什么是 (type)null 的原因。


1
文档说明代码等同于关键字为等同。您可以删除强制转换,结果与表达式作为类型相同,但为什么要提及每个可能的功能等效性呢?

首先,null(type)null有什么区别?

在这种情况下,它们没有区别。它们等同于同一件事。作者可能选择使用(type)null是因为它更清楚地传达了as的工作方式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接