31

私はこのようなクラスを持っています

public class MyClass
{
    public int Id { get; set; }
    public Nullable<DateTime> ApplicationDate { get; set; }
    ....
}

今、私はMyClassこのようなオブジェクトを埋めようとしています

DataTable dt = DBHelper.GetDataTable(sql, conn);
DataRow dr = dt.Rows[0];

MyClass oMyClass = new MyClass();
oMyClass.Id = (int)dr["Id"];
oMyClass.ApplicationDate = dr["ApplDate"] == DBNull.Value ? null : Convert.ToDateTime(dr["AppDate"]); 
//Above line gives an error
....

申請日の値を割り当てるとエラーが発生する

Type of conditional expression cannot be determined because there is no implicit conversion between '<null>' and 'System.DateTime'

ここで何が欠けていますか?

4

6 に答える 6

74

nullにキャストする必要がありますDateTime?:

oMyClass.ApplicationDate = dr["ApplDate"] == DBNull.Value 
    ? (DateTime?)null 
    : Convert.ToDateTime(dr["AppDate"]); 

これは、コンパイラが条件演算子の結果の型を決定する方法によるものです。動作は設計によるものです。

first_expression と second_expression の型が同じであるか、一方の型から他方の型への暗黙的な変換が存在する必要があります。

それnull自体は null 型であり、それとの間の変換がないため、キャストしてコンパイラを支援する必要があります。

于 2012-10-12T08:28:33.997 に答える
7
oMyClass.ApplicationDate =
    dr["ApplDate"] == DBNull.Value ?
    (DateTime?)null :
    Convert.ToDateTime(dr["AppDate"]);

コンパイラが知っているのは、一方が anullに評価され、もう一方が a に評価されるということだけDateTimeです。コンパイラーは一方から他方に変換できないため不平を言うので、それらを両方の値になる可能性のあるものにキャストするのはあなた次第です。

DateTime?の略であることに注意してくださいNullable<DateTime>。また、 と の間に
暗黙的な変換があるため、null 値をキャストするだけでよいことに注意してください。これにより、コンパイラはその変換自体を行うことができます。DateTime?DateTime

于 2012-10-12T08:28:17.417 に答える
4

これを試して:

oMyClass.ApplicationDate = 
    dr["ApplDate"] == DBNull.Value ? (DateTime?)null : 
                                     Convert.ToDateTime(dr["AppDate"]); 

最後の式にキャストを適用することもできます。

于 2012-10-12T08:28:42.423 に答える