以下代码导致使用未分配的局部变量“ numberOfGroups”:
int numberOfGroups;
if(options.NumberOfGroups == null || !int.TryParse(options.NumberOfGroups, out numberOfGroups))
{
numberOfGroups = 10;
}
但是,此代码可以正常工作(尽管ReSharper说的= 10
是多余的):
int numberOfGroups = 10;
if(options.NumberOfGroups == null || !int.TryParse(options.NumberOfGroups, out numberOfGroups))
{
numberOfGroups = 10;
}
我是否缺少某些东西,或者编译器不喜欢我的东西||
?
我将范围缩小到dynamic
导致问题的范围(options
在我上面的代码中是一个动态变量)。问题仍然存在,我为什么不能这样做?
该代码无法编译:
internal class Program
{
#region Static Methods
private static void Main(string[] args)
{
dynamic myString = args[0];
int myInt;
if(myString == null || !int.TryParse(myString, out myInt))
{
myInt = 10;
}
Console.WriteLine(myInt);
}
#endregion
}
但是,此代码可以:
internal class Program
{
#region Static Methods
private static void Main(string[] args)
{
var myString = args[0]; // var would be string
int myInt;
if(myString == null || !int.TryParse(myString, out myInt))
{
myInt = 10;
}
Console.WriteLine(myInt);
}
#endregion
}
我没有意识到dynamic
这是一个因素。
我很确定这是一个编译器错误。好发现!
编辑:这不是一个漏洞,正如Quartermeister所展示的那样;动态的可能实现一个奇怪的true
运算符,这可能导致y
它永远不会初始化。
这是最小复制:
class Program
{
static bool M(out int x)
{
x = 123;
return true;
}
static int N(dynamic d)
{
int y;
if(d || M(out y))
y = 10;
return y;
}
}
我认为没有理由将其视为非法;如果您将动态替换为bool,则可以正常编译。
我实际上明天要与C#团队见面;我会向他们提及。抱歉的错误!
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句