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/

10-17 00:58