2012-04-19 24 views
0

私はこのコードを持っている:条件演算子

private MyClass CreateObject(MyOtherClass myOtherClass) 
{ 
    return new MyClass 
    { 
     Name = myOtherClass.Name, 
     ValidationDate = (DateTime)myOtherClass.ValidationDate //ValidationDate is nullable 
    }; 
} 

私はこれを行う場合、私はコンパイルエラーを持っている: なし暗黙のがあるので、条件式の

タイプを決定することができません'<null>''System.DateTime'

private MyClass CreateObject(MyOtherClass myOtherClass) 
{ 
    return new MyClass 
    { 
     Name = myOtherClass.Name, 
     ValidationDate = (myOtherClass.VALIDATION_DATE == null) ? null : DateTime.Now //ValidationDate is nullable 
    }; 
} 
間の変換

私はこれを行う場合は、何の問題:

MyClass myClass = new MyClass(); 
if (myClass.ValidationDate == null) 
    myClass.ValidationDate = null; 

疑問は、なぜないのですか?とSolustion? :)

+1

'MyClass.ValidationDate'と' MyOtherClass.ValidationDate'の型は何ですか? –

+1

「私がこれをすれば問題はない」と言うとき。私は違うように頼みます、あなたは何もしません。 nullをすでにnullだった値に設定しています。 –

+1

Nitpic - ヌル合体演算子は '?? 'です。あなたは条件演算子 '?:'について話しています。 – Oded

答えて

3

最初のコードブロックの問題は、null可能なDateTime値をDateTimeにキャストしようとしていることです。

は代わりにNULL可能日時(DateTime?)にキャストしてみてください。

ValidationDate = (DateTime?)myOtherClass.ValidationDate 

あなたはすべての後にNULL可能DateTimeフィールドを移入しようとしているので。

あなたはmyOtherClass.ValidationDateがnullの場合は、デフォルト値を提供しようとしている場合は、合体演算子(不要キャスト)を使用します。

ValidationDate = myOtherClass.ValidationDate ?? DateTime.Now 
+0

両方のフィールドが両方とも「DateTime?」です。これは問題のある条件文にどのように役立ちますか? – Oded

+0

それを指摘してくれてありがとう@Oded。 2番目のコードブロックで 'DateTime.Now'が表示されません – GolfWolf

0

キャストをnullDateTime?へ:

ValidationDate = (myOtherClass.VALIDATION_DATE == null) ? 
                (DateTime?)null : DateTime.Now; 

条件演算子は、2つの結果ブランチが暗黙的に変換可能な同じタイプのものであることを要求します。 DateTime.NowブランチのDateTimeDateTime?間の暗黙的な変換があるため、上記の作品 - それ自体でnull以来

は、任意の型に対応していない、あなたはその枝をキャストする必要があります。

0

null合体演算子は実際には??です。これはコード内のどこにも表示されません。使用したのは3項演算子です。私はそれが機能するためには、2つの可能な結果(この場合はnullDateTime.Now)を同じタイプに変換可能である必要があります。

、単にラインを変更してみてください:

ValidationDate = myOtherClass.VALIDATION_DATE ?? DateTime.Now; 
+0

またはw0lfが指摘するように、NULL可能なdatetimeにキャストして同じタイプにします。 – Bridge

0

はMyOtherClassでValidationDateがNULL可能日時であれば、そしてMyClassの中ValidationDateが( - NULL可能ではない)のDateTimeである、あなたはこれを行うことができます。

ValidationDate = myOtherClass.ValidationDate?? DateTime.Now