Linq содержит путаницу

Я заметил что-то странное с linq и методом Contains. Кажется, он запутался в том, что Содержит метод для вызова.

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

Приведенный выше код не компилируется со следующей ошибкой:

Аргументы типа для метода "System.Linq.Enumerable.Contains(System.Collections.Generic.IEnumerable, TSource, System.Collections.Generic.IEqualityComparer)" не могут быть выведены из использования. Попробуйте явно указать аргументы типа.

Если я удаляю оператор linq, он доволен содержимым (но тормозит весь код linq).

Каков правильный синтаксис, чтобы сообщить компилятору, что я хочу использовать метод String.Contains, а не Linqs?

Приветствия

Ответ 1

Это связано с тем, что в BCL нет метода String.Contains(string, StringComparison), и компилятор пытается использовать метод расширения. Там определяется только метод String.Contains(string).

Ответ 2

Каков правильный синтаксис, чтобы сообщить компилятору, что я хочу использовать метод String.Contains, а не Linqs?

Нет перегрузки String.Contains, который принимает StringComparision. Возможно, вы захотите использовать String.IndexOf(string, StringComparison):

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

Ответ 3

Это может быть потому, что метод string.Contains принимает только один параметр (a string; перегрузка string.Contains, которая принимает значение StringComparison), в то время как метод расширения Enumarable.Contains занимает два. Однако параметры, которые вы поставляете, не соответствуют ожидаемым типам ввода, поэтому компилятор запутывается.

Ответ 4

Как сказал Дарин Димитров, String.Contains(string, StringComparison) не существует как метод для типа String.

System.Linq.Enumerable однако содержит такую ​​подпись. А String также является IEnumerable<char>, поэтому компилятор запутывается. Фактически вы могли бы использовать Linq и компилировать, если бы вы заменили StringCompar- ison на ICompar- er из Char:

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