【发布时间】:2015-03-11 19:04:20
【问题描述】:
我有一些类似于以下的代码。
class MyClass<TEnum> where TEnum : struct
{
public IEnumerable<TEnum> Roles { get; protected set; }
public MyClass()
{
IEnumerable<string> roles = ... ;
TEnum value;
Roles = from r in roles
where Enum.TryParse(r, out value)
select value; // <---- ERROR HERE!
}
}
然而,在上面指出的那一行,我得到了错误:
使用未赋值的局部变量'value'
在我看来value 在这种情况下总是会被初始化,因为它是Enum.TryParse 的out 参数。
这是 C# 编译器的错误吗?
【问题讨论】:
-
@SwDevMan81:完全不一样。
-
btw.: 即使它可以编译并完成它的工作 --- 你的代码仍然是错误的。当您选择一个封闭的外部变量时,结果列表的所有成员的值都是相同的。你也可以
select 0。最优雅的解决方案是返回 int? 的 TryParse 扩展方法 -
@JonathanWood:实际上,它有很多共同点。在构造 lambda 时而不是在调用它时检查“确定分配”状态这一事实是两者的根本原因。
-
@DasKrümelmonster:你的意思是
Parse?但这会在失败时引发异常。他希望每个解析失败的项目为零,每次成功的解析都需要一个项目...这可以使用SelectMany来完成。