2016-05-24 11 views
0

以下の2つの違いは何ですか?データテーブルの名前付きフィールドと名前付きカラムの相違点

var dtime = (DateTime)datatable[0]["SomeDateTime"]; 
var dtime = datatable[0].field<DateTime>("SomeDateTime"); 

EDIT と、この最初の行で

var dtime = Convert.ToDateTime(datatable[0]["SomeDateTime"]); 
+0

「データテーブル」とは何ですか?なぜなら、それはコンパイルされない 'DataTable 'だからです。擬似コードを提供するのではなく、コードをコンパイルしてください(またはそれが問題の場合にコンパイルされないコード)。 –

+0

おそらく、あなたはDataRowCollectionについて話しています。あなたの変数の名前をわかりにくくしてください。 – Steve

+0

これはデータテーブルであり、エラーなしでコンパイルされます。私が得る唯一のエラーは例外のキャストです。はい、データテーブルにインデックスを付けることで、実際にはデータローですが、これを変更することはできますが、これは混乱しているとは思いません。 – nik

答えて

3

に差が異なる実装を検査することができます

は、第二はDataRow拡張メソッドFieldに舞台裏キャストのに対し、最初は自分で明示的なキャストを使用していることです。日時列がNULL値を含めることができる場合

だからDateTime?を使用します。

DateTime? dtime = datatable.Rows[0].Field<DateTime?>("SomeDateTime"); 

だから私はFieldを使用することをお勧めします。これは強く型付けされ(キャストを隠す)、null可能な型をサポートします。 (TypeName)による明示的なキャストも読みにくいです。

+0

Timに感謝します。したがって、データテーブルにnullが含まれている場合、フィールドのみが機能しますか? – nik

+0

@nik:はい、私は例を示しました。 –

1

var dtime = (DateTime)datatable[0]["SomeDateTime"]; 

あなたがobjectを返すインデクサプロパティを使用します。そのため、実際にオブジェクトが存在すると予想されるタイプに自分自身をキャストする必要があります。

二ケース

var dtime = datatable[0].Field<DateTime>("SomeDateTime"); 

はあなたのための鋳造を行うにしようとあなたが(そうDateTimeあなたの例では)指定された型を返すジェネリック拡張メソッドField<T>を呼び出します。あなたはindexerのリファレンス・ソースとField<T>() extension method

0

与えられた例との主な違いは、

(Type)が今まであなたが持っているタイプと力、それはerroring、そのタイプになるために何を取る変換する方法であり、それ

<Type>

がジェネリック型で渡しているsuitibleありませんあなたの変換を支援する場面のロジックがあることを意味します。

およびConvert.ToType()は変換のためにコンバータクラスを使用しています。 IConvertableインターフェイスこれは、誰かがそのタイプを変換可能にすることを考えていることを意味します。これは成功した結果を得る可能性が高いことを意味します。

これ以外の場合、名前付きフィールド(このプロパティまたはフィールドメソッド

関連する問題