2013-04-05 10 views
9

Po napotkaniu pewnych problemów z Massive dzisiaj postanowiłem stworzyć prosty program testowy, aby zilustrować problem. Zastanawiam się, co jest błędem robię w tym kodzie:C# dynamiczne i pracujące z kolekcjami IEnumerable

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

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

var count = data.Count(); 

Ostatnia linia zgłasza błąd: „obiekt” nie zawierają definicji dla „count”

Dlaczego "dane" traktowane jako obiekt? Czy ten problem występuje, ponieważ wywołuję metodę rozszerzenia?

Poniższy kod działa:

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

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

foreach (var s in data) 
{ 
} 

Dlaczego w tym przypadku "dane" jest właściwie traktowany jako IEnumerable?

+0

możliwe duplikat [metody Extension i dynamicznego obiektu w C#] (http://stackoverflowflow.com/questions/5311465/extension-method-and-dynamic-object-in-c- sharp) – nawfal

Odpowiedz

5

Wydaje się, że metody rozszerzeń nie działają na obiektach dynamicznych (patrz Jon' answer). Jednakże, można wywołać te bezpośrednio jako metody statyczne:

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

Tak, to dlatego Count() jest metoda rozszerzenie.

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) prace, ponieważ datamusi narzędzi IEnumerable być foreach źródło - nie ma (IEnumerable)data konwersji wykonywane w trakcie realizacji.

Można zobaczyć, że mechanish gdy próbuje zrobić następujące:

dynamic t = 1; 

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

Istnieje wyjątek rzucony w czasie wykonywania: Cannot implicitly convert type 'int' to 'System.Collections.IEnumerable'

Powiązane problemy