2012-03-04 4 views
0

C#が新機能なので、短文で問題が発生しています。しかし私は、短い手のバージョンがあるため、条件付きのエラー」タイプを決定することができません生成、単一行のif文でキャストエラーが発生する

if (m_dtLastLogin == null) 
    drow["LastLogin"] = DBNull.Value; 
else 
    drow["LastLogin"] = m_dtLastLogin; 

drow["LastLogin"] = (m_dtLastLogin == null) ? System.DBNull.Value : m_dtLastLogin; 

への長い手のバージョンは素晴らしい作品...変換したいです'System.DBNull'と 'System.DateTime?'の間の暗黙的な変換はありません。私のサポートコードは基本的に...

誰かがここでショートハンドを助けることができますか? 「オブジェクト」に

+3

は '?'、それは単に条件演算子だ「場合は、単一の行」ではありません。 –

+0

?:両方の条件で同じ型を返す必要があります... – sebagomez

+0

目下のこと: 'm_dtLAstLogin.HasValue'をお尋ねします – sebagomez

答えて

5

まあ、エラーメッセージはかなり明確です。コンパイラは、x?y:z式全体の型を決定する必要があります。 yとzが同じ型の場合は、簡単です。 yがzに変換可能な場合、式の型はzの型であり、同様に、zがyに変換可能な場合、その型はyの型である。

yの型はDBNull、yの型はm_dtLastLoginの型(多分datetime)です。これらの2つの型は相互に変換できず、共通の基本型(Objectを除く)を持たないため、コンパイラは何をすべきか分からない。

は、オブジェクトには、yまたはzのいずれかをキャストすることによって、しかし、コンパイラを助けることができる:

drow["LastLogin"] = (m_dtLastLogin == null) ? (object)System.DBNull.Value : m_dtLastLogin; 

または

drow["LastLogin"] = (m_dtLastLogin == null) ? System.DBNull.Value : (object)m_dtLastLogin; 

をこの方法で式全体が、その後することができタイプのオブジェクトを、持っていますdrow["LastLogin"]に割り当てられました。

リファレンス: C#言語仕様 - http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-334.pdf

セクション14.13、条件演算子

引用

の第二及び第三のオペランド:?演算子は、条件式のタイプを制御します。 XとYを2番目と3番目のオペランドの型とする。次に、

  • XとYが同じ型の場合は、これが条件式の型です。

  • そうでなければ、暗黙の変換(13.1)がXからYまで存在し、YからXには存在しない場合、Yは条件式のタイプです。

  • それ以外の場合は、暗黙の変換(13.1)がYからXまで存在し、XからYには存在しない場合、Xは条件式のタイプです。

  • それ以外の場合は、式の型が特定されず、コンパイル時エラーが発生します。

+0

意味があります。私は(DateTime?)System.DBNull.Valueでオブジェクトをあまりにも特定していた – Curtis

+0

私は言語仕様への参照を追加しました。 –

0

キャスト両方:

drow["LastLogin"] = (m_dtLastLogin == null) ? (object)System.DBNull.Value : 
    (object)m_dtLastLogin; 

条件演算子は、両方の部分(「次に」と「他」部分)の結果タイプされる、同じ型に評価することが必要表現。

元のバージョンは、タイプがobjectのフィールドになったため、キャストなしで機能しました。

+0

2つの部分は同じ型を持つ必要はありません。彼らは1つの一般的なタイプに変換可能である必要があります。 –

関連する問題