为什么编译器无法推断我的变量未分配?

时间:2019-09-02 20:43:47

标签: c#

每当if语句很庞大(需要检查的条件)时,我喜欢声明一个布尔值并将其分配给所有条件,以便if语句像if(conditions)一样简单,例如在下面的代码示例中。

static void Main(string[] args)
{
    int[] ages = new int[] { 20, 21, 22 };
    int age;

    bool conditions =
        ages.Length > 0 &&
        (age = ages[0]) > 21;
    if (conditions)
    {
        // cs0165 use of unassigned local variable 'age'
        Console.WriteLine("Age: " + age);
    }
}

但是将条件移至布尔值会使C#编译器感到困惑;它不知道总是age被分配给它。我需要按如下方式编写以避免出错:

static void Main(string[] args)
{
    int[] ages = new int[] { 20, 21, 22 };
    int age;

    if (ages.Length > 0 && (age = ages[0]) > 21)
    {
        Console.WriteLine("Age: " + age);
    }
}

在原始情况下,为什么编译器无法推断分配给它的内容?

2 个答案:

答案 0 :(得分:4)

  

为什么编译器不能推断它已分配?

因为它不使用那样的变量,即使有时我们可能希望使用它。或者更确切地说,这与编译器的作用无关,而与C#规范和标准所要求的一样。

if语句条件内,age的分配状态变为“在真表达式后确定分配”,这意味着在if语句 body 中,它肯定是分配的。但是标准和编译器并没有将其扩展为“好吧,我们将值分配给了该变量,并且没有别的东西会改变该变量的值,因此,如果变量为true,那么表达式也必须也为true”,因此它应该明确分配。

有关详细信息,请参见ECMA C# 5 standard的10.4节,尤其是10.4.4.6。祝你好运-有点毛...

答案 1 :(得分:-2)

因为可能未分配。如果第一个条件失败ages.Length,似乎下一个表达式将不被评估:age = ...

有关C#,请参见boolean logical operators参考