tags:

views:

362

answers:

4

Hi,

I have noticed something odd with linq and the Contains method. It seems to get confused on which Contains method to call.

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

The above code doesn't compile with the following error:

The type arguments for method 'System.Linq.Enumerable.Contains(System.Collections.Generic.IEnumerable, TSource, System.Collections.Generic.IEqualityComparer)' cannot be inferred from the usage. Try specifying the type arguments explicitly.

If I remove the using linq statement it is happy with the contains (but brakes all the linq code).

What is the correct syntax to tell the compiler I want to use the String.Contains method and not Linqs?

Cheers

+4  A: 

This is because there's no String.Contains(string, StringComparison) method defined in the BCL and the compiler tries to use an extension method. There's only String.Contains(string) method defined.

Darin Dimitrov
Lol, cheers. Could have sworn it was.
Dominic Godin
+1  A: 

It could be because the string.Contains method takes only one parameter (a string; there is no overload of string.Contains that takes a StringComparison value), while the Enumarable.Contains extension method takes two. However, the parameters that you supply do not fit the expected input types, so the compiler gets confused.

Fredrik Mörk
A: 

What is the correct syntax to tell the compiler I want to use the String.Contains method and not Linqs?

There is no overload of String.Contains that accepts a StringComparision. You might want to use String.IndexOf(string, StringComparison):

// s is string
if(s.IndexOf(strVar, StringComparison.OrdinalIgnoreCase) >= 0) {
    // code here
}
Jason
A: 

As Darin Dimitrov said, String.Contains(string, StringComparison) does not exist as a method for the String type.

System.Linq.Enumerable however does contain such a signature. And a string is also an IEnumerable<char>, that's why the compiler gets confused. You would actually be able to leverage Linq and compile if you replaced the StringCompar-ison with an ICompar-er of Char:

if (myString.Contains(strVar, Comparer<Char>.Default))
{
    // Code here                  
}
herzmeister der welten
string is an `IEnumerable<char>`
Isaac Cambron
This will not work. `string` does not implement `IEnumerable<string>`.
Jason
sorry, yes, f1x0red
herzmeister der welten