为什么此条件(null ||!TryParse)会导致“使用未分配的局部变量”?

布兰登·马丁内斯

以下代码导致使用未分配的局部变量“ 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么此C#代码会引发错误:使用未分配的局部变量'n'

为什么编译器会引发错误CS0165:使用未分配的局部变量?

为什么会收到“使用未分配的局部变量”的信息?

在while条件中使用未分配的局部变量和“无法写入已关闭的TextWriter”。

“使用未分配的局部变量”错误的原因是什么?

为什么try / finalize块不会抛出CS0165:使用未分配的局部变量编译错误?

使用-notMatch条件验证参数时,为什么要满足此条件?

为什么将window.location.hostname传递到此条件语句会导致跨源错误?

为什么将QThread创建为局部变量会导致行为不同

为什么C ++编译器不将此条件布尔分配优化为无条件分配?

将js函数分配给局部变量后,为什么它们会失败?

使用未分配的局部变量“ x”

使用未分配的局部变量“ strCity”

使用未分配的局部变量“ SHELLEXECUTEINFO”

使用未分配的局部变量数组

使用未分配的局部变量“ folderPath”

错误“使用未分配的局部变量”?

使用未分配的局部变量“书”

什么是“分配前引用的局部变量”

为什么它不直接使用实例字段,而是将其分配给局部变量?

不使用局部变量时为什么会获得EXC BAD ACCESS?

局部变量的内存被重新分配 - 为什么

为什么分配的局部变量变为空

为什么局部变量会自动更改

为什么局部变量会自我更新?

为什么 printf 会修改以前的局部变量?

在带有TryParse的if语句中使用动态分配的if语句中的“未分配的局部变量的使用”

使用已分配的未分配局部变量

使用foreach循环时使用未分配的局部变量