2016-05-26 9 views
0

私は私の周りC#三成分を使用した結果

仕事したい問題を持っている私は、NULL可能日時を宣言していると私はそれの日付またはAのいずれかを置くしようとしています三項演算子を使用してヌル値。

これは動作しません:

DateTime? date; 
date = getDate() == DateTime.MinValue ? null : getDate() 

を私自身のコードでは、もう少し手の込んだですが、基本的に私が使用したいが、私は機能を行うにはしたくない

date = getDate() == DateTime.MinValue ? null : resultofgetDate()withoutactuallyrunningitagain 

です2回目ですが、この場合はボーナスとして、datetimesなので、最初の例ではelseセクションに There is no implicit conversion between 'null' and 'System.DateTime'というエラーが表示されます。

私はどの方向に向いているか分かりません。私はnull合体演算子(?)の反対が必要なようです。

+2

になります。 'var dt = getDate(); 'と同じです。 – afaolek

+0

getdate()の戻り値の型は何ですか? –

答えて

1

に思えます。三項式で使用される値は、同じタイプのものでなければならないため、エラーが発生しています。

あなたの最初の例では、MaKCbIMKoの答えで指摘したように

date = getDate() == DateTime.MinValue ? null : (DateTime?)getDate()` 

で動作するはずです。

エラー処理/検証の一種としてDateTime.MinValueを返すとします。メソッドのシグネチャを変更してDateTime?を返す場合は、代わりにnullを返すと、ステートメントはdate = getDate()

+0

これは私の例では動作しますが、それでもこの方法を2回実行する必要があります。それは他の方法がないので問題ではありません。 @ MaKCbIMKoのソリューションは私が使い終わったものですが、あなたのものは質問に近いので、答えとしてマークしています。 – InFerNo

+0

getDate()の結果をいつでも一時変数に保存することができます。 'DateTime temp = getDate();' 'date = temp == DateTime.MinValue? null:(DateTime?)temp' –

2

このような演算子はありません。

DateTime? date = getDate(); 
date = date == DateTime.MinValue ? null : date; 
+2

これは正しくありません。 'DateTime.MinValue'は'ブール 'ではありません – afaolek

+0

@afaolekあなたは正しいです - 答えを書いている間に誤って提出しました。 – Rob

1

してくださいは、as Rob describedはそれを行うが、ここでは拡張メソッドが私の感想です:あなたはこのような何かを書くことができます

public static T? Test<T>(this T? value, Predicate<T?> test, T? ifEquals) where T : struct 
{ 
    if (test(value)) 
    { 
     return ifEquals; 
    } 

    return value; 
} 

このようにそれを使用します。

DateTime? d = GetDate().Test(t => t == DateTime.MinValue, null); 
+0

'T?'と 'T?'の間に '=='を使用できますか? ___追加:___ 'Nullable.Equals(value、test)'を考慮するか、制約と4つの '?'' EqualityComparer .Default(value、test) 'を使用してください。 –

+0

いいえ、それはできません;)@JeppeStigNielsen –

+0

@JeppeStigNielsen今や述語を使って、それはずっときれいです。 –

1

てきましたあなたは次のようなものを試しました:

DateTime? date; 
var dt = getDate(); 
date = dt == DateTime.MinValue ? (DateTime?)null : dt; 

それが助けてくれることを願っています。

0

また、(過負荷の一方が他方1を呼び出します)、この拡張メソッドを作成することができます。もちろん

public static T? NullIfHasDefaultValue<T>(this T v) where T : struct 
{ 
    return EqualityComparer<T>.Default.Equals(v, default(T)) ? (T?)null : v; 
} 
public static T? NullIfHasDefaultValue<T>(this T? n) where T : struct 
{ 
    return n.GetValueOrDefault().NullIfHasDefaultValue(); 
} 

getDate().NullIfHasDefaultValue()として使用します。 getDate()DateTimeなくDateTime?(別名Nullable<DateTime>)を返しているかのように

関連する問題