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

Why does this (null || !TryParse) conditional result in quot;use of unassigned local variablequot;?(为什么这个 (null || !TryParse) 条件会导致“使用未分配的局部变量?)

本文介绍了为什么这个 (null || !TryParse) 条件会导致“使用未分配的局部变量"?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

以下代码导致使用未分配的局部变量numberOfGroups":

int numberOfGroups;
if(options.NumberOfGroups == null || !int.TryParse(options.NumberOfGroups, out numberOfGroups))
{
    numberOfGroups = 10;
}

然而,这段代码运行良好(虽然,ReSharper 说 = 10 是多余的):

However, this code works fine (though, ReSharper says the = 10 is redundant):

int numberOfGroups = 10;
if(options.NumberOfGroups == null || !int.TryParse(options.NumberOfGroups, out numberOfGroups))
{
    numberOfGroups = 10;
}

是我遗漏了什么,还是编译器不喜欢我的 ||?

Am I missing something, or is the compiler not liking my ||?

我已将其缩小到导致问题的 dynamic (options 是我上面代码中的动态变量).问题仍然存在,为什么我不能这样做?

I've narrowed this down to dynamic causing the issues (options was a dynamic variable in my above code). The question still remains, why can't I do this?

这段代码不能编译:

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 会是其中的一个因素.

I didn't realize dynamic would be a factor in this.

推荐答案

我很确定这是一个编译器错误.很好的发现!

I am pretty sure this is a compiler bug. Nice find!

这不是错误,正如 Quartermeister 所展示的那样;dynamic 可能会实现一个奇怪的 true 运算符,这可能会导致 y 永远不会被初始化.

it is not a bug, as Quartermeister demonstrates; dynamic might implement a weird true operator which might cause y to never be initialized.

这是一个最小的复制:

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 替换 dynamic 它编译就好了.

I see no reason why that should be illegal; if you replace dynamic with bool it compiles just fine.

实际上我明天要与 C# 团队会面;我会跟他们提的.为错误道歉!

I'm actually meeting with the C# team tomorrow; I'll mention it to them. Apologies for the error!

这篇关于为什么这个 (null || !TryParse) 条件会导致“使用未分配的局部变量"?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本文标题为:为什么这个 (null || !TryParse) 条件会导致“使用未分配的局部变量"?

基础教程推荐