1. ホーム
  2. c#

[解決済み] なぜこのコードは "Possible null reference return "というコンパイラの警告を出すのですか?

2023-04-17 19:58:54

質問

以下のコードを考えてみましょう。

using System;

#nullable enable

namespace Demo
{
    public sealed class TestClass
    {
        public string Test()
        {
            bool isNull = _test == null;

            if (isNull)
                return "";
            else
                return _test; // !!!
        }

        readonly string _test = "";
    }
}

これをビルドすると !!! でマークされた行はコンパイラの警告を出します。 warning CS8603: Possible null reference return. .

私はこれが少し紛らわしいと思います。 _test は読み取り専用で、非NULLに初期化されます。

以下のようなコードに変更すると、警告が消えます。

        public string Test()
        {
            // bool isNull = _test == null;

            if (_test == null)
                return "";
            else
                return _test;
        }

この挙動を説明できる人はいますか?

どのように解決するのですか?

ヌーラブルフロー解析では ヌル状態 を追跡しますが、その他の状態、たとえば bool 変数の値 (例えば isNull のように)、また、別々の変数の状態の間の関係を追跡しません(例: isNull_test ).

実際の静的解析エンジンは、おそらくこれらのことを行うでしょうが、ある程度は "ヒューリスティック、または "恣意的でもあるでしょう。

これは、C# コンパイラーで直接できることではありません。nullable 警告のルールは非常に洗練されていますが (Jon の分析が示すように!)、それはルールであり、推論することが可能です。

しかし、厄介な場所がいくつかあり、C# 9.0 ではそれらを再検討する予定です。