2011-06-28 31 views
5
var dict = new Dictionary<string, object>(); 
DateTime? myDate; 

/*Next line gives: Type of conditional expression cannot be 
determined because there is no implicit conversion between 'System.DateTime?' 
and 'System.DBNull' */ 

dict.Add("breakit", myDate.HasValue ? myDate.Value : DBNull.Value); 

型Objectを予期しているディクショナリに入ると、暗黙の変換が必要な理由がわかりません。この式で三項演算子を使用できないのはなぜですか?

+2

この非常に頻繁にSOに質問をしています。詳細については、http://stackoverflow.com/questions/2215745/conditional-operator-cannot-cast-implicitly/2215959#2215959を参照してください。関連記事http://blogs.msdn.com/b/ericlippert/archive/2010/05/27/cast-operators-do-not-obey-the-distributive-law.aspx –

+0

@Eric I'llも参照してください見てみな。ありがとう! – scottm

+1

ようこそ。問題は、コンパイラの理由とは逆の方向で推論していることです。あなたは、「これは、オブジェクトが期待されるものになることを知っている」と言っています。しかし、コンパイラはあなたが先験的に*選択される "オブジェクト"メソッドを望んでいることを知らない。コンパイラは、逆の理由を試みています。 「この表現にオブジェクトが適合することを期待する方法はありますか?それは "表現のタイプは何ですか?" **問題は、式が動作するかどうかを判断するために式の型を動かすことができないことです** ** –

答えて

6

C#では、すべての条件式に型が必要です。あなたの表現はどんなタイプですか?

私はあなたの懸念を理解していますが、変換は特定のケースでは必要ありませんが、これはC#コンパイラの仕組みなので、その規則に従わなければなりません。

これは(私もチェックしていなかった)の代わりに動作するはずです:

dict.Add("breakit", myDate.HasValue ? (object)myDate.Value : (object)DBNull.Value); 
+0

myDate.Valueの条件に応じてmy式の型がSystem.DateTimeまたはDBNullのいずれかである必要があります – scottm

+0

オブジェクトは機能しません。 – scottm

+0

それは静的型ではなく動的型です。 C#コンパイラは静的な型付けされています。 – Zruty

1

あなたがしようとしました:

DateTime? date = myDate.HasValue ? myDate.Value : null; 

dict.Add("breakit", date); 
+1

これは同じエラーです。 – scottm

+0

マスターベースクラスのときにオブジェクトにキャストする必要があるのはなぜですか? –

関連する問題