为什么在使用Linq时需要初始化out变量

Tho*_*ser 2 c# linq

假设我有一个字符串,我想转换为整数,我会这样做

int i;
int.TryParse(someString, out i);
Run Code Online (Sandbox Code Playgroud)

现在我想在Linq查询中做同样的事情:

int i;
var numbers =
   from s in someStrings
   where int.TryParse(s, out i)
   select i;
Run Code Online (Sandbox Code Playgroud)

但这拒绝编译错误

CS0165使用未分配的局部变量'i'

当我将i初始化为任意值时,它会按预期编译和工作.但为什么我必须这样做?

Jon*_*eet 6

查询表达式被翻译成:

var numbers = someStrings.Where(s => int.TryParse(s, out i))
                         .Select(s => i);
Run Code Online (Sandbox Code Playgroud)

现在,我们知道从Where调用的lambda表达式创建的委托将在从调用的lambda表达式创建的委托之前执行Select,但编译器不会.事实上,您可以轻松编写自己的扩展方法,但不遵守:

public static IEnumerable<T> Where<T>(
    this IEnumerable<T> source,
    Func<T, bool> predicate)
{
    // I can't be bothered to check the predicate... let's just return everything
    return source;
}
Run Code Online (Sandbox Code Playgroud)

此时,通过正常Select调用,您的委托返回i将在没有为其分配值的情况下执行.

基本上,明确的赋值规则是故意相当保守的,避免对做什么方法做出任何假设等.