6

これにはおそらく私が見落としている簡単な説明がありますが、なぜ次のコードが合法なのですか:

    public struct Foo
    {
        const object nullObject = null;

        public override string ToString()
        {
            if (nullObject == null)
            {
                return base.ToString();
            }

        }
    }

以下ながら、

    public struct Foo
    {
        const dynamic nullObject = null;

        public override string ToString()
        {
            if (nullObject == null)
            {
                return base.ToString();
            }

        }
    }

次のコンパイル時エラーが発生します: Foo.ToString()': すべてのコード パスが値を返すわけではありませんか?

nullObjectであるという事実により、コンパイラーはそれが常に であるとdynamic断言できなくなるのはなぜですか?nullObjectnull

編集:質問を拡張し、 smooreの回答に基づいて、なぜコンパイラーはdynamic constフィールドの開始を許可するのですか? なんか自暴自棄じゃない?このシナリオには実際の用途がまったくなく、率直に言ってまったく無意味であることはわかっていますが、まったくの偶然で偶然見つけて、興味をそそられました。

4

1 に答える 1

6

動的オブジェクトはコンパイル時に解決されないため、コンパイラはそれが常に null になることを認識していません。動的オブジェクトは実行時まで解決されません。

編集:

私はあなたの混乱を見て、なぜ const ダイナミックを許可するのですか?

私の推測では、Dynamic を null 非許容型に変更できます。その場合、ToString は値を返しませんが、それは単なる推測です。また、静的コンストラクターの外で値が変更されないようにするために、動的定数を保持する機能が必要な場合もあると考えていますが、実行時まで型を知ることはできません。

Servy が指摘するように、もう 1 つの可能性は、修正する価値のない非常にまれなケースであるということです。

于 2013-05-09T15:55:57.107 に答える