2013-10-27 17 views
6

私は次のエラーを取得:オペレータ '??'タイプのオペランドに適用することはできません 'のSystem.DateTime'

Operator '??' cannot be applied to operands of type 'System.DateTime' 

foreach (EndServReward r in reward) 
          { 
           if (con.State == ConnectionState.Closed) 
           { 
            con.Open(); 
           } 
           myIfxCmd.Parameters[0].Value = r.EmpNum ; 
           myIfxCmd.Parameters[1].Value = (r.ServDate) ?? DBNull.Value; 
          } 

reward is List<EndServReward> rewardを、なぜこれが起こると、それを修正する方法?

答えて

11

??はヌル合体演算子です。
nullの値には適用できません。

+0

なぜ 'r.ServDate'を' null'にできないのですか?!!私はそれらが空のプロパティであるか、値で設定されていないかチェックしたいです。 –

+2

@just_nameこれはなぜそれがnullでもない理由です:http://msdn.microsoft.com/en-us/library/vstudio/1t3y8s4s.aspx –

+0

次に、これらのプロパティを設定せずにdbに挿入すると、何がエラーになりますか? –

6

nullcoalescing演算子は、本来null-不可能な型には、DateTimeのようにデフォルトでは適用できません。とにかくそれを使用したい場合は、ヌル可能なタイプとしてDateTimeを使用することを予見する必要があります。 DateTime? dt;

3

あなたr.ServDateプロパティはNULL可能にする必要がある:デフォルトで

public DateTime? ServDate { get; set; } 

日時は、日時がValueTypeにある

2

NULL可能ではありません。値の型はNULL可能ではありません。常に値を持ちます。

これは、整数でも同じです倍増など値がnullであるので、それが必要でない場合は、チェックを使用している

演算子。

ただし、値をMinなどの基本値と照合することを検討することもできます。実際には、この変数のデフォルト値が受け入れ可能であるかどうかを検討し、それに対してチェックします。

また、intを考えてみましょう。あなたはそれをnullと照合するのではなく、ゼロまたはネガティブに対してチェックすることができます。

3

あなたは他の回答で示唆されているようにNULL値可能、またはあなたのコードに、このようなヘルパーメソッドを追加するタイプを変更することができ、次のいずれか

private bool IsDefault<T>(T value) 
{ 
    if (value == null) 
     return false; 
    return value.Equals(default(T)); 
} 

次にこれにコードを変更:

myIfxCmd.Parameters[1].Value = IsDefault<DateTime>(r.ServDate) ? (object)DBNull.Value : (object)r.ServDate; 
1

他の答えで正しく指摘されているように、値型-DateTimeにNull-Coalescing演算子を使用することはできません。

myIfxCmd.Parameters[1].ValueNullを割り当てようとする前に。最初の質問はServDateプロパティのデフォルト値をEndServRewardクラスに設定していますか? nullまたはDateTime.Minに変換するのではなく、オブジェクト自体を作成するときのデフォルト値をServDataに設定する方が適切です。これにより、機能を1か所で決定し、一貫したソリューションを提供するのに役立ちます。

データベースに更新するのではなく、作成時にDateTime.MinまたはNullのいずれかを選択できます。

関連する問題