2016-11-24 10 views
0

を使用して、私は方法ExecuteQueryを持っており、それがオブジェクト_dataAccessの方法であるDatatableオブジェクトを返して、これはSystem.DataVARキーワードと名前空間

string query = "select * from UserNeeds where userNeedID =" + item.ParentId; 
var result = _dataAccess.ExecuteQuery(query, CommandType.Select); 
foreach (var rows in result.Rows) 
{ 

} 

を使用してとの適切なコンパイルしますが、私はVARを変更した場合元の型を与えた場合DatatableSystem.Dataが見つからないので、漫画の時間エラーが表示されます。

varをタイプしておけば、System.Dataが名前空間であることをコンパイラが理解することができます。

varの代わりに元のdatatypeを使用すると、強制的にどのようにコンパイラが処理するのですか?

+0

basicaly varは匿名型です。あなたはそれについてもっと読むことができます[ここ](https://msdn.microsoft.com/en-us/library/bb397696.aspx) –

+0

@ m.rogalski:['var'] (https://msdn.microsoft.com/en-us/library/bb383973.aspx)は匿名型ではなく、関連性はありません。 kewordの 'var'は、その変数の実際の型のプレースホルダーのようなものです。したがって、あなたは 'Dictionary >>を書く必要はありません。dict =新しい辞書>>();' 'var dict = new Dictionary >>()'を使うことができます。 –

答えて

2

varは単独では型ではありませんが、コンパイラによって解決される実際の型のプレースホルダです。 DataRowCollectionDataRable.Rowsが返す)はIEnumerable<DataRow>を実装していませんが、非汎用のIEnumerableインターフェイスのみを実装しているので、foreachオブジェクトrowsObjectです。ループ内でDataRowのプロパティとメソッドを使用することはできません。

あなたは毎回それを唱えたり、それがforeachでキャストするようにする必要があります。

foreach (DataRow row in result.Rows) 
{ 

} 

今、あなたはその理由を、あなたのファイルの先頭にusing System.Dataを追加したり、そう

foreach (System.Data.DataRow row in result.Rows) 
{ 

} 

を使用する必要がありますコンパイラがvarでコンパイルする理由は、DataRowCollectionがDataRowsではないオブジェクトなので、varの場合はコンパイラがSystem.Objectを使用するということです。

0

名前空間は、任意のオブジェクトの短い記法です。指定しないと、完全なオブジェクト名を与える必要があります。

Varは、完全なオブジェクト名で動的に作成したオブジェクトタイプを格納する1回限りの動的データ型です。