我将项目从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();
}
编译器返回错误:
Error CS0165 使用未赋值的局部变量'b'
是什么原因导致了这个问题? 是否可以通过编译器设置来解决它?
out
参数分配后才使用b
。 - Jon Skeetout
参数的所有弊端。要是TryParse
返回一个可为空的值(或等价物)就好了。 - Konrad Rudolphfrom v in array let a = decimal.Parse(v) let b = decimal.Parse("15") where a <= b select v
(或者,如果可空类型是合适的单子,你可以使用SelectMany
并编写from v in array from a in Parse(v) from b in Parse("15") where a <= b select v
—— 这实际上是有效的 C# 代码,只要定义了合适的Parse
)。在真正的代码中(OP 的代码根本没有意义),这种写法甚至更易读。 - Konrad Rudolphdecimal a, b; var q = decimal.TryParse((dynamic)"10", out a) && decimal.TryParse("15", out b) && a <= b;
。我已经提交了一个Roslyn bug来解决这个问题。 - Rawling