1. ホーム
  2. c#

[解決済み] この (null || !TryParse) 条件が "未割り当てのローカル変数の使用" になるのはなぜですか?

2023-01-03 02:17:54

質問

次のコードでは は未割り当てのローカル変数 "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; 
    }
}

Dynamicをboolに置き換えれば、問題なくコンパイルできます。

実は明日 C# チームと会う予定なので、彼らに伝えておきます。 エラーをお詫びします!