2011-02-08 3 views
6

이 가능한 중복 : 나는 오히려에 놀라게했다
Why does var evaluate to System.Object in “foreach (var row in table.Rows)”?"VAR"형식 유추는

는 ....

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"]); 
} 

가는 무슨 다음 오늘 발견 여기에?

이것은 유형 유추 실패입니까? 그렇다면 무엇이 그것을 일으키는가?

정의 된 동작 또는 var의 일부입니까? 그렇다면 왜?

나는 var의 아이디어는 당신이 행동을 변경하지 않고 변수 선언/초기화 어디에서나 사용할 수 있다고 생각했다.

+1

'DataRowCollection.GetEnumerator()'는 'IEnumerator'를 반환합니다. 'IEnumerator.Current'의 타입은'object'입니다. –

+0

[정확한 중복 질문] (http://stackoverflow.com/questions/2325777/why-cant-i-do-foreach-var-item-in-datatable-rows) 기본적으로 행'DataRowCollection', 그래서 컴파일러는 'DataRow'가 아닌'Object'를 선택합니다. – Axarydax

답변

3

여기 포인트는 var가 아니고 foreach 루프입니다. foreach 루프는 iterating 자체와 함께 iterator를 선택적으로 캐스팅 할 수 있습니다.

그래서 다음을 수행 할 수 있습니다 : 목록 유형의 객체이다

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

그래서 경우에도, foreach는 내부 즉석에서 int로 캐스트 할 수 있습니다.

+0

감사합니다. 첫 번째 예제에서 반복자가 명시 적 캐스트를 필요로하지 않는 이유가 궁금했습니다. – fearofawhackplanet

+0

변수 이름의 왼쪽에있는 유형이 열거 형의 객체 유형과 일치하지 않으면 null 참조 예외가 발생합니다. 'ListOfBaseTypes'에서 파생 된 'foreach'를 사용하여'ListOfBaseTypes'에있는 모든 것이 'DerivedType' 유형이 아니라면 제대로 작동 할 것이라고 기대할 수 없습니다 – Stephen

0

혼란은 foreach(SomeType thing in SomeCollection)이 컬렉션을 반복하는 것이 아니라 반복되는대로 각 항목에 대해 SomeType으로 형 변환을 시도한다는 것입니다. 하지만 var에는 아무 것도 없습니다.

1

DataTable.RowsInternalDataCollectionBase의 하위 클래스 인 System.Data.DataRowCollection을 반환합니다.

memthod는 IEnumerator<DataRows> 대신 IEnumerator을 반환합니다.

은 따라서 사용할 수있는 유일한 유형 정보는 object를 반환, 그래서 당신이 지정할 때 당신은 당신이 var하지 않는 자신의 캐스트를 추가 DataRow을 열거하고 있습니다.