2013-04-05 4 views
9

Dopo aver riscontrato alcuni problemi con Massive oggi, ho deciso di creare un semplice programma di test per illustrare il problema. Mi chiedo, qual è l'errore che sto facendo in questo codice:C# dinamico e funzionante con raccolte IEnumerable

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

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

var count = data.Count(); 

L'ultima riga genera un errore: 'oggetto' non contiene una definizione per 'conte'

Perché il "dati" trattati come un oggetto? Questo problema si verifica perché sto chiamando un metodo di estensione?

Il seguente codice funziona:

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

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

foreach (var s in data) 
{ 
} 

Perché in questo caso "di dati" viene correttamente trattato come IEnumerable?

+0

possibile duplicato del [metodo di estensione e oggetto dinamico in C#] (http://stackoverflow.com/questions/5311465/extension-method-and-dynamic-object-in-c-sharp) – nawfal

risposta

5

Sembra che i metodi di estensione non funzionino sugli oggetti dinamici (vedere Jon' answer). Tuttavia, è possibile chiamare quelli direttamente come metodi statici:

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

Sì, è perché Count() è un metodo di estensione.

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) opere, perché dataha da attrezzi IEnumerable ad essere una fonte foreach - c'è (IEnumerable)data conversione eseguita durante l'esecuzione.

Si può vedere che mechanish quando si cerca di fare seguendo:

dynamic t = 1; 

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

C'è un eccezione generata in fase di esecuzione: Cannot implicitly convert type 'int' to 'System.Collections.IEnumerable'