2013-05-09 12 views
6

これはおそらく私が見に失敗しています簡単に説明しているが、なぜ次のコードは有効です。古い参照フィールド対動的フィールドのconst constの行動

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() ':すべてのコードパスが値を返すわけではありませんか?

なぜは、dynamicであるということは、コンパイラは、nullであると主張できないのですか?

EDIT:質問に拡大し、smoore's回答に基づいて、なぜコンパイラはdynamicconstフィールドで開始することができませんか?それは自己の一種ではないのですか?私はこのシナリオがまったく実際のアプリケーションを持っていないことを知っています。それは率直に言っても意味がありませんが、私はそれを偶然の事故で見つけただけで不思議に思っています。

+1

'動的なconstフィールドはなぜ始まっていますか? '技術的には、' const'をあらゆるタイプのフィールドに適用することができます。他の機能と同様に、「なぜ私はこの機能を実装していないのですか?」という質問はありません。 「なぜ私はこの機能を実装する必要がありますか?」この場合、この機能は、 'const'フィールドが'動的である 'ことを明示的に禁止することです。ほとんどの機能要求と同様に、その答えは「時間と労力にかけるだけでは足りず、追加する重要な機能がありました」と考えられます。これは、あなた自身の足で自分自身を撃つためのあなたの方法からかなり外に出ています。 – Servy

答えて

6

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

EDIT:

私はあなたの混乱を参照してください、なぜさえconstのダイナミックを許可しますか?

私の推測では、Dynamicは非null型に変更できます。その場合、ToStringは値を返しませんが、それは単なる推測です。私はまた、静的コンストラクタの外側では値が変更されず、実行時まで型がわからないようにするために、一定の動的性を持たせたいと考えるかもしれません。

もう一つの可能​​性は、Servyが指摘しているように、修正する価値がないようなコーナーケースだということです。

+0

私はそれを理解していますが、なぜ、 '動的な' 'const'フィールドで始めることができるのですか?全体のポイントは、 'const'は静的ではないということです。 – InBetween

+0

@Tejas:いいえ、そのコードはコンパイルされません。参照constフィールドは、常に 'class'だった' string'を除いてのみ 'null'に初期化することができます。値の型は、最初に定数式にのみ初期化することができます。 – InBetween

+0

@Tejas 'const'値はコンパイル時に評価されなければならないので、メソッドを呼び出すことはできません。 –

関連する問題