【问题标题】:`out` variable unassigned... unless the condition is inline? [duplicate]`out` 变量未赋值...除非条件是内联的? [复制]
【发布时间】:2019-07-01 23:19:16
【问题描述】:

我试图了解 C# 编译器在决定何时分配 out 变量时的规则。

这是一个让我感到困惑的例子。假设我们有一个Dictionary<>

var dict = new Dictionary<string, string>();

让我们从一个简单的条件开始:编译。

var found = dict.TryGetValue("b", out var val);
if(found)
{
    Console.WriteLine(val); //no problem
}

如果条件稍微复杂一点,就是编译错误:

var aBool = true;
var found = aBool && dict.TryGetValue("b", out var val);
if(found)
{
    Console.WriteLine(val); //use of unassigned local variable val
}

好的,所以我猜编译器在这种情况下不处理逻辑运算符。
...但如果我们将完全相同的条件移入内联,它又是彩虹:

var aBool = true;
if(aBool && dict.TryGetValue("b", out var val))
{
    Console.WriteLine(val); //compiles fine
}

为什么?

【问题讨论】:

  • 值得注意的是&amp; 有效而&amp;&amp; 无效,例如var found = aBool &amp; dict.TryGetValue("b", out var val); 没问题。使用&amp;&amp;,由于short circuit evaluation 可能不会调用TryGetValue,因此val 可能保持未初始化状态..

标签: c# out


【解决方案1】:

编译器无法保证变量val 已初始化。在这种情况下,aBool 是一些(非常量)布尔表达式。根据aBool 的值,val 可能会或可能不会被初始化。

为了帮助编译器,您必须使 aBool const 以便编译器可以执行完整的分析。如果aBool == trueval 肯定会被初始化。如果falseval肯定没有初始化。然后流分析可以确定found 将设置为与val 变量的状态一致的值。

const bool aBool = true;
...

第二种情况很好的原因,val 只在if 语句的主体中使用。只有当aBooltrue 并且TryGetValue() 调用成功(因此val 被初始化)时,才会输入正文。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-15
    • 2014-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-26
    • 1970-01-01
    • 2018-03-25
    相关资源
    最近更新 更多