2011-02-08 22 views
6

Olası Çoğalt: Doğrusu şaşırdı
Why does var evaluate to System.Object in “foreach (var row in table.Rows)”?"var" tür kesmesi

....

SqlDataReader reader = cmd.ExecuteReader(); 
DataTable schemaTable = reader.GetSchemaTable(); 


// the following compiles correctly 
foreach (DataRow field in schemaTable.Rows) 
{ 
    Console.WriteLine(field["ColumnName"]); 
} 


// the following does not compile as 'var' is of type 'object' 
foreach (var field in schemaTable.Rows) 
{ 
    // Error: Cannot apply indexing with [] to an expression of type 'object' 
    Console.WriteLine(field["ColumnName"]); 
} 

Ne oluyor şu bugün keşfetti burada?

Bu bir tür çıkarsama hatası mı? Ve eğer öyleyse, ne sebep olur?

Veya tanımlı davranışların bir parçası mı yoksa var mu? Ve eğer öyleyse, neden?

var fikrini, davranışını değiştirmeden, herhangi bir değişken bildiriminde/ilklendirmesinde kullanabilirsiniz.

+1

'DataRowCollection.GetEnumerator()', 'IEnumerator' döndürür. IEnumerator.Current 'türü' object' türüdür. –

+0

[tam çift soru] (http://stackoverflow.com/questions/2325777/why-cant-i-do-foreach-var-item-in-datatable-rows) Temel olarak Satırlar bir "DataRowCollection", yani derleyici 'Nesne' toplar, 'DataRow' – Axarydax

cevap

3

Buradaki nokta var değil, foreach döngüsüdür. Foreach döngüsü isteğe bağlı olarak kendini yinelemenin yanı sıra yineleyiciyi de kullanabilir.

Yani aşağıdakileri yapabilirsiniz: Liste türü nesnenin olduğu

List<object> test = new List<object>(); 
test.Add(1); 
test.Add(2); 
test.Add(3); 
foreach(int i in test){ 
    i.Dump(); 
} 

Yani olsa bile, foreach içindeki anında int dökülebilir.

+0

Bunu bilmiyordum, teşekkürler. İlk örnekte yineleyicinin neden açık bir döküm gerektirmediğini merak ediyordum. – fearofawhackplanet

+0

Bunu yaparsanız, değişken adının solundaki türün numaralandırmadaki nesnenin gerçek türüyle eşleşmemesi durumunda boş bir başvuru istisnası alacağınızı unutmayın. 'ListOfBaseTypes' türetilmiş türetilmiş 'türetmek için foreach' ve 'ListOfBaseTypes' türündeki her şey "DerivedType" türünde olmadığı sürece düzgün çalışmasını beklemezsiniz. – Stephen

0

Bu karışıklık, foreach(SomeType thing in SomeCollection)'un yalnızca koleksiyonda yinelenmesi değil, aynı zamanda yinelendiğinde her öğe için bir SomeType'a dökülmeye çalıştığıdır. Ama var ile birlikte yapacak hiçbir şey yok.

1

DataTable.Rows, InternalDataCollectionBase'un bir alt sınıfı olan System.Data.DataRowCollection değerini döndürür.

Buradaki GetEnumerator öğesi, IEnumerator<DataRows> yerine IEnumerator değerini döndürür.

Dolayısıyla kullanılabilen tek tip bilgileri object döndürür, yani belirtirken sen var değil kendi döküm ekliyoruz DataRow numaralandırma.

İlgili konular