2010-02-24 25 views
24

Có một lý do tại sao tôi không thể làm như sau:Tại sao tôi không thể làm foreach (var Item trong DataTable.Rows)?

foreach (var Item in DataTable.Rows) { 

thay vì phải làm

foreach (DataRow Item in DataTable.Rows) { 

Tôi đã có thể nghĩ điều này là có thể, giống như nó là trên kiểu dữ liệu khác. Ví dụ:

foreach (var Employee in Staff) { // string[] Staff etc... 

Khi tôi cố gắng vòng lặp foreach đầu tiên, tôi nhận được các CS0021 lỗi : Không thể áp dụng lập chỉ mục với [] để một biểu hiện của loại 'đối tượng'.

Tại sao trình biên dịch không thể hiểu được .Rows trả về một tập hợp DataRows?

Trả lời

25

Rows trả về hiệu quả IEnumerable (DataRowCollection), vì vậy trình biên dịch chỉ có thể chọn object làm loại cho var. Sử dụng Rows.Cast<DataRow> nếu bạn muốn sử dụng var.

Cast được xác định trên Enumerable, vì vậy bạn phải bao gồm System.Linq.

+0

Were datatables trước Generics? –

+0

@Arnis: Tuyệt đối, DataTable đã có từ 1.0. –

+0

Vì vậy - tôi đoán đó là lý do thực sự. Ty Jon để làm rõ. :) –

20

Brian là hoàn toàn đúng về lý do cho điều này, nhưng có một cách đơn giản hơn để tránh nó: sử dụng :

foreach (var row in DataTable.AsEnumerable()) 
{ 
    ... 
} 
+0

Cảm ơn bạn vì một giải pháp tiện lợi :) Tôi đã giữ Câu trả lời được chấp nhận là Brian nhưng sẽ sử dụng máy của bạn. Đó là thời gian đọc về Enumerables nhiều hơn một chút ... – GateKiller

+8

Tôi muốn nói giải pháp thực sự cho vấn đề sẽ là không sử dụng var trong trường hợp này ... – cjk

+1

@ck: Đồng ý, nhưng đáng để biết về 'AsEnumerable' để kết hợp với các phương pháp LINQ khác. –

Các vấn đề liên quan