2016-01-12 20 views
5

私はC#dynamicというキーワードにはかなり新しいです。私のプロジェクトの1つでは、私はそれを試してみて、予想外の動作に遭遇しました。私は、次のコードでの状況を再現するために管理:ダイナミックは戻り値の型を尊重しません

class Program 
{ 
    static DateTime? DateOnly(DateTime? time) 
    { 
     return time.HasValue ? (System.DateTime?)time.Value.Date : null; 
    } 

    static void Main(string[] args) 
    { 
     dynamic now = System.DateTime.Now; 
     var date = DateOnly(now); 
     Console.WriteLine(date.Value); // error thrown here 
     Console.Read(); 
    } 
} 

私はRuntimeBinderException「のSystem.DateTime」が「値」の定義が含まれていません

を言ってます。

ように可変dateDateTime代わりにDateTime?として扱われます。

dynamicのように、戻り値の型宣言が何とか無視されます。 vardynamicを併用しないでください。

答えて

5

dynamic変数をDateOnlyメソッドに渡すので、戻り値の型も動的になります。この場合、var dateは実際にはdynamic dateです。それはボックス化されたnullable DateTimeを含んでいますが、ボクシングは "nullable"部分を保持しないので、実際にはそれはのValueプロパティを持たない単なるボックスです。したがって、値を印刷するにはConsole.WriteLine(date)を実行するだけです。

あなたが見ることができるように、NULL可能なタイプとdynamicは非常によく一緒にプレーしていない...

0

あなたの関数のパラメータを見ると、null可能な型を要求しています。 DateTime(System.DateTime.Now)は値型であり、値の型はデフォルトでNULL可能ではありません。

+0

@PoweredByOrange NULL可能は構造体です。 –

2

2つの問題があります。 1つは、右辺が動的式であるため、dateはまだ動的であるということです。特定のタイプDateTime?dateと宣言した場合、これは表示されません。もう1つの問題は、null可能な値の型を戻し、動的に変換することがボクシングとみなされることです。 Nullable値型は決してボックス化されません。基礎となる値型はラップされていないので、dateは、objectの参照のように動作します。これは、DateTimeを持つことも、nullでもかまいません。DateTime?への参照ではありません。バインダーはDateTimeに対してプロパティValueを解決しようとし、失敗します。 Console.WriteLine(date)を試してみると、あまりにも多くのオーバーロードがあるため、あいまいではありません。だからConsole.WriteLine((object)date)のような何かをしなければならないでしょう。この単純な例では、dateobjectとして宣言することもできます。

+0

「右手側」を意味しましたか? –

+0

@ThomasLevesqueうん、私は他の左を意味した。一定。 –

関連する問題