2013-04-05 30 views
9

Sau khi gặp phải một số vấn đề với Massive hôm nay, tôi quyết định tạo một chương trình thử nghiệm đơn giản để minh họa sự cố. Tôi tự hỏi, những sai lầm tôi đang làm trong mã này là những gì:C# động và làm việc với bộ sưu tập IEnumerable

var list = new List<string> 
       { 
        "Hey" 
       }; 

dynamic data = list.Select(x => x); 

var count = data.Count(); 

Dòng cuối cùng ném một lỗi: 'đối tượng' không chứa một định nghĩa cho 'Đếm'

Tại sao "dữ liệu" được coi là một đối tượng? Sự cố này có xảy ra không vì tôi đang gọi một phương thức khuyến nông?

Các mã sau hoạt động:

var list = new List<string> 
       { 
        "Hey" 
       }; 

dynamic data = list.Select(x => x); 

foreach (var s in data) 
{ 
} 

Tại sao trong trường hợp này "dữ liệu" được xử lý một cách chính xác như IEnumerable?

+0

thể trùng lặp của [phương pháp mở rộng và đối tượng năng động trong C#] (http://stackoverflow.com/questions/5311465/extension-method-and-dynamic-object-in-c-sharp) – nawfal

Trả lời

5

Dường như phương pháp mở rộng không hoạt động trên các đối tượng động (xem Jon' answer). Tuy nhiên, bạn có thể gọi những người trực tiếp như các phương pháp tĩnh:

var count = Enumerable.Count(data); // works 
6

Vâng, đó là bởi vì Count() là một phương pháp mở rộng.

extension methods aren't supported by dynamic typing in the form of extension methods, i.e. called as if they were instance methods. (source)

foreach (var s in data) công trình, bởi vì dataphải cụ IEnumerable là một nguồn foreach - có (IEnumerable)data chuyển đổi thực hiện trong thực hiện.

Bạn có thể thấy rằng mechanish khi cố gắng làm như sau:

dynamic t = 1; 

foreach (var i in t) 
    Console.WriteLine(i.ToString()); 

Có một ngoại lệ ném vào runtime: Cannot implicitly convert type 'int' to 'System.Collections.IEnumerable'

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