【发布时间】: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
}
为什么?
【问题讨论】:
-
值得注意的是
&有效而&&无效,例如var found = aBool & dict.TryGetValue("b", out var val);没问题。使用&&,由于short circuit evaluation 可能不会调用TryGetValue,因此val可能保持未初始化状态..