int foo;
int? bar;
if (bar != null)
{
foo = bar; // does not compile
foo = (int)bar; // compiles
foo = bar.Value; // compiles
}
我早就知道第一个陈述是不正确的,但它一直困扰着我。我已经验证
bar
不为空,那么为什么编译器会提示? 最佳答案
bar
的类型仍然是 int?
,并且没有从 int?
到 int
的隐式转换。
该条件不会改变后面代码的有效性。其他 Actor 也是如此:
object x = ...;
if (x is string)
{
string y = x; // This is still invalid
string z = (string) x; // This is fine
}
编译器很少使用一段代码的结果来影响另一段代码的有效性。再举一个例子:
bool condition = ...;
string x;
if (condition)
{
x = "yes";
}
if (!condition)
{
x = "no";
}
Console.WriteLine(x); // Invalid
最后一行无效,因为
x
仍然没有明确分配。我们知道,无论 x
的值是多少,我们都会输入 if
语句体之一......但编译器不会试图弄清楚这一点。尽管这可能看起来很愚蠢,但它使语言规则变得更加简单。
关于c# - 为什么在检查 null 后需要显式转换?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16692417/