无法将null分配给隐式类型的变量

use*_*057 5 c#

根据Visual Studio,这不行:

var foo = null;
Run Code Online (Sandbox Code Playgroud)

但这没关系:

var foo = false ? (double?)null : null;
Run Code Online (Sandbox Code Playgroud)

为什么?是否(double?)null也在nullelse分支中起作用?

Man*_*ota 7

因为编译器无法预测null的类型。Null 可以分配给任何可为空的数据类型,也可以分配给任何引用类型变量。因此,对于隐式转换,您必须将 null 强制转换为某种特定类型。

var dt = (DateTime?)null; // This is correct
var dt1 = null; // This will throw compile time error.
Run Code Online (Sandbox Code Playgroud)


das*_*ght 6

隐式类型变量声明/赋值有两个目的:

  • 确定变量的值,并
  • 决定变量的类型。

您的第一个声明具有null该值,而没有办法弄清楚类型(它可以是从System.Object或派生的任何东西Nullable<T>)。这就是为什么它是一个错误。

您的第二个声明将类型精确定位为Nullable<double>因为强制转换。这就是C#允许它的原因。

不用说,它double? foo = null会更容易阅读。

  • @user2061057因为条件表达式要求两个分支具有兼容的类型,并且“null”与“double?”类型兼容。 (2认同)