【发布时间】:2015-11-04 20:06:44
【问题描述】:
在我将项目从 VS2013 迁移到 VS2015 后,项目不再构建。以下 LINQ 语句出现编译错误:
static void Main(string[] args)
{
decimal a, b;
IEnumerable<dynamic> array = new string[] { "10", "20", "30" };
var result = (from v in array
where decimal.TryParse(v, out a) && decimal.TryParse("15", out b) && a <= b // Error here
orderby decimal.Parse(v)
select v).ToArray();
}
编译器返回错误:
错误 CS0165 使用未分配的局部变量“b”
是什么导致了这个问题?是否可以通过编译器设置来修复它?
【问题讨论】:
-
@BinaryWorrier:为什么?它仅在通过
out参数分配后才使用b。 -
The VS 2015 documentation says "虽然作为输出参数传递的变量在被传递之前不必初始化,但被调用的方法需要在方法返回之前分配一个值。"所以这看起来确实像一个错误,是的,它保证由该 tryParse 初始化。
-
不管错误如何,这段代码都说明了
out参数的所有缺点。TryParse会返回一个可为空的值(或等效值)吗? -
@KonradRudolph
where (a = decimal.TryParse(v)).HasValue && (b = decimal.TryParse(v)).HasValue && a <= b看起来好多更好 -
请注意,您可以将其简化为
decimal a, b; var q = decimal.TryParse((dynamic)"10", out a) && decimal.TryParse("15", out b) && a <= b;。我已经 opened a Roslyn bug 提出了这个问题。