看看这个示例项目:
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
的原因。
代码等同于
关键字为等同
。您可以删除强制转换,结果与表达式作为类型
相同,但为什么要提及每个可能的功能等效性呢?
首先,
null
和(type)null
有什么区别?
在这种情况下,它们没有区别。它们等同于同一件事。作者可能选择使用(type)null
是因为它更清楚地传达了as
的工作方式。
null
可以是任何类型。但是如果您想要一个空字符串,您必须将null
强制转换为string
。如果您将表达式分配给var x
,则编译器不知道x
应该是哪种类型,如果分配结果为null
。 因此需要进行强制转换。 - Emaronull
可以安全地转换为任何特定的引用类型。 - Lasse V. Karlsen