2015-11-06 85 views
5

Sto provando a chiamare IEnumerable.Contains() con un argomento dynamic, ma sto ottenendo l'errorePerché devo eseguire il cast di un oggetto dinamico quando si chiama IEnumerable.Contains()?

'IEnumerable' non contiene una definizione per 'Contiene' ei migliori metodo di estensione di sovraccarico Queryable.Contains'(IQueryable, TSource) 'ha alcuni argomenti non validi

Ho notato che posso trasmettere l'argomento al tipo corretto oppure utilizzare un tipo di raccolta sottostante per risolvere il problema. Ma non sono sicuro del motivo per cui non posso passare direttamente l'argomento.

dynamic d = "test"; 
var s = new HashSet<string>(); 
IEnumerable<string> ie = s; 

s.Contains(d);   // Works 
ie.Contains(d);   // Does not work 
ie.Contains((string)d); // Works 
+0

@JonSkeet se lo tolgo, getta errore nel mio vs2012 non disperatevi – MethodMan

+0

forse ho avuto un errore di battitura @JonSkeet io rimuovere il commento per eliminare ogni confusione – MethodMan

+0

@JonSkeet Ho rimosso di nuovo ... grazie. – MethodMan

risposta

5

Enumerable.Contains è un metodo di estensione - e metodi di estensione non vengono risolti dal mini-compilatore che viene utilizzato in fase di esecuzione. (I metodi di esecuzione dipendono dalle direttive using, che non sono conservate, ma potrebbero essere considerate un po 'dolorose). Ciò include sia l'uso degli argomenti dynamic per i metodi di estensione, e in uso come "target" "dei metodi di estensione.

Basta specificare il metodo di estensione direttamente invece:

var result = Enumerable.Contains(ie, d); 
+0

Funziona su questo [compilatore online] (https://dotnetfiddle.net/xPvF8e). – ryanyuyu

+0

@ryanyuyu no, non fa un errore notare la linea rossa ondulata quando si passa con il mouse su 'b = ie.Contains (d);' quando si fa clic sul collegamento – MethodMan

+0

@MethodMan e si noti che era il codice originale dell'OP che produce il Squiggly. La soluzione di Jon Skeet non produce un errore. – ryanyuyu