2012-02-05 9 views
0

ため、鋳造私はC#でジェネリック医薬品に新しいですし、本を読みながら例つまずい:は、ジェネリックを使用する代わりに、AsEnumerable

var cars = from car in data.AsEnumerable() 
    where 
    car.Field<string>("Color") == "Red" 
    select new 
    { 
     ID = car.Field<int>("CarID"), 
     Make = car.Field<string>("Make") 
    }; 

著者はcar.Field<string>("Color")(string)car["Color"]と比較チェックする追加のコンパイル時間を与えることを言います。しかし、コンパイラはcar.Field<string>("Color")が "CarID"ではなく "Color"に対してコンパイル可能であることをどのように知っていますか?あるいは、別の「コンパイル時の追加チェック」がありますか?

+0

@DBM、 'car'は' IEnumerableを 'ではない、それは 'T'です。 – svick

+0

ああ、そうです。私は疲れています... Tは 'DataRow' –

答えて

2

追加のコンパイル時のチェックはありません。間違った型を使用すると、どちらの場合でも実行時に例外が発生します。

しかし、単純なキャストでは不可能な追加の操作を行うと便利です。たとえば、Field<int>("CarId")は、フィールド内のstringintに変換するメソッドを呼び出すことができます。

DataRow.Field<T>()について言えば、ドキュメントによれば、ほとんどの場合、nullの値とヌル入力可能な型を正しく処理するのに便利です。

0

コンパイラは、 "Color"フィールドがstring型であることを指定しています。内部的には、Field<T>()メソッドはそれを実現させる魔法です。

あなたはキャスト((string)car["Color"])を実行した場合、フィールドの値が先の型に変換できない場合は、実行時例外が発生する可能性があります。

メモリからあなたがcar.Field<string>("ColorID")を指定した場合、あなたは安全に問題なく文字列にint型に変換することができるようになります。

0

具体的にはcar.Field<string>("Color")の実質的な利点は、テストフィールドの値をDBNull.Valueと等価にカプセル化し、コードをよりきれいにして読みやすくすることです。あなたの例では

「カラー」フィールドの値がnullの場合car["Color"]DBNull.Valueを返します。一方で、Field<T>拡張メソッドは、nullを返します。 DBNull.Valuestringにキャストすることはできませんので、式(string)car["Color"]InvalidCastExceptionになります。

DataSetExtensionsクラスの開発の前に、あなたはstring変数にそのフィールドの値を割り当てるために、やや冗長な表現が必要になります

var color = DBNull.Value.Equals(car["Color"]) ? null : (string)car["Color"]; 

Field<T>のもう一つの利点は、それことを、svickノートとして、あります同じ構文を使用して、null可能な型と参照型を扱うことができます。

関連する問題