9

次のエラーが表示されます。

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、なぜこれが起こるのか、そしてそれを修正する方法は?

4

6 に答える 6

13

??null 合体演算子です。
できない値に適用しても意味がありませんnull

于 2013-10-27T14:24:18.250 に答える
8

nullcoalescing 演算子は、 のような本質的に null 非許容の型にデフォルトで適用することはできませんDateTime。とにかくそれを使用したい場合はDateTime、たとえば次のように、null 許容型として使用することを予見する必要があります。DateTime? dt;

于 2013-10-27T14:24:56.697 に答える
3

DateTime は ValueType です。値の型は null 可能ではありません - それらは常に何らかの値を持っています。

これは、整数、倍精度などについても同じです。

使用している Operator は、値が null かどうかをチェックするため、必要ありません。

ただし、Min などのベース値に対して値を確認することを検討してください。実際に、この変数のデフォルト値が許容可能かどうかを検討し、それに対してチェックする必要があります。

繰り返しますが、int を考えてみましょう。null に対してはチェックしませんが、ゼロまたはマイナスに対してはチェックできます。

于 2013-10-27T14:36:25.710 に答える
3

他の回答で提案されているように、型を nullable に変更するか、次のようなヘルパー メソッドをコードに追加できます。

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;
于 2013-10-27T14:36:41.157 に答える
1

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

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

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

于 2013-10-27T15:24:01.227 に答える