2010-02-02 20 views
10

Ho notato qualcosa di strano con linq e il metodo Contains. Sembra confondersi su quale metodo Contiene chiamare.Linq contiene confusione

if (myString.Contains(strVar, StringComparison.OrdinalIgnoreCase)) 
{ 
    // Code here     
} 

Il codice precedente non viene compilato con il seguente errore:

Gli argomenti di tipo per il metodo 'System.Linq.Enumerable.Contains (System.Collections.Generic.IEnumerable, TSource, System.Collections .Generic.IEqualityComparer) 'non può essere dedotto dall'uso. Prova a specificare esplicitamente gli argomenti del tipo.

Se rimuovo l'istruzione linq using è contento del contenuto (ma frena tutto il codice linq).

Qual è la sintassi corretta per indicare al compilatore che voglio utilizzare il metodo String.Contains e non Linqs?

Acclamazioni

+7

che il titolo è più divertente quando si legge male. –

+0

Ha Ha vero. Immagino che ci fosse più saggezza nel titolo della domanda stessa. – Magpie

risposta

7

Questo è perché non c'è String.Contains(string, StringComparison) metodo definito nel BCL e il compilatore cercherà di utilizzare un metodo di estensione. C'è solo il metodo String.Contains(string) definito.

+0

Lol, evviva. Avrebbe giurato che lo fosse. – Magpie

1

Potrebbe essere perché il metodo string.Contains accetta un solo parametro (un string, non c'è sovraccarico string.Contains che assume un valore StringComparison), mentre il metodo Enumarable.Contains estensione richiede due. Tuttavia, i parametri forniti non si adattano ai tipi di input previsti, quindi il compilatore viene confuso.

0

Come ha detto Darin Dimitrov, String.Contains(string, StringComparison) non esiste come un metodo per il tipo di String.

System.Linq.Enumerable tuttavia contiene tale firma. E uno string è anche un IEnumerable<char>, ecco perché il compilatore viene confuso. Si potrebbe effettivamente essere in grado di sfruttare Linq e compilare se è stato sostituito lo StringCompar- ison con un'ICompar- er di Char:

if (myString.Contains(strVar, Comparer<Char>.Default)) 
{ 
    // Code here     
} 
+1

stringa è un 'IEnumerable ' –

+0

Questo non funzionerà. 'stringa' non implementa' IEnumerable '. – jason

+0

scusate, sì, f1x0red – herzmeister