每当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);
}
}
在原始情况下,为什么编译器无法推断分配给它的内容?
答案 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参考