2017-01-17 5 views
0

私はDataSetを使用していますが、foreachループで列を反復処理すると、ColumnName(varキーワードを使用している場合)を取得できません:C#DataSet foreach

DataTable table1 = new DataTable("patients"); 
table1.Columns.Add("name"); 
table1.Columns.Add("id"); 
table1.Rows.Add("sam", 1); 
table1.Rows.Add("mark", 2); 

とのforeachを使用するよりも

enter image description here

しかしforeach文を明示的に定義されている場合:

enter image description here

すべてがOKです。 私はforeachがEnumaratorの構文的砂糖であることを知っています。 それはある種の遺産とGenericsの欠如ですか?

+0

これは珍しいことではありません。私のVS 2017 RCは、オブジェクトが列であるようにあなたのコードを扱いますが、私はVS 2015のコピーを私は明示的にキャストするか、foreachで型を宣言しなければなりません。私はこれが何よりもIDEの問題だと思う。 – CDove

+0

@CamiloTerevinto C#1.0で書かれたコードで、より良いオプションがないため、実際には 'DataColumn'インスタンスではないため、' object'です。 – Servy

+0

XmlNodeのforeachで使用されているvarが実際の型を推測しない、オブジェクトのみの重複の可能性がありますか?](http://stackoverflow.com/questions/17106986/why-var-used-in-foreach-for-xmlnode-does -not-deduce-real-type-only-object) –

答えて

0

DataTable.ColumnsはDataColumnCollectionです。 DataColumnCollectionはIEnumerableを実装していますが、IEnumerableではありません。<DataColumn> foreach文は、指定した型のキャストを実行します。 Varは、列挙子メソッドが返すものを指定します(この場合Objectです)。

+0

IEnumerableではなくIEnumerableです。 あなたはIEnumeratorを意味すると思います。 しかし、なぜそれがオブジェクトにキャストされているのですか/通常はvarにオブジェクトタイプがありますか? –

+0

答えは、標準の 'IEnumerable'を実装し、汎用の' IEnumerable 'を実装していないということです。これは、 'foreach(table1.Columns内のDataColumn列)'のようなことをして、別の型(DataColumn)に変換しない限り、DataTable.Columnsを反復処理すると 'object'型のオブジェクトを返すことを意味します。 – Ceshion

0

ジェネリックスのレガシーと不足の種類ですか?

はい。このコードは、ジェネリックが存在する前にC#1.0で書かれています。