LINQ包含混淆

10

我注意到使用linq和Contains方法时出现了一些奇怪的问题。它似乎在选择要调用的Contains方法方面感到困惑。

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

上述代码无法编译,出现以下错误:

方法“System.Linq.Enumerable.Contains(System.Collections.Generic.IEnumerable, TSource, System.Collections.Generic.IEqualityComparer)”的类型参数不能从用法中推断出来。请尝试显式指定类型参数。

如果我删除使用 linq 的语句,那么它就可以使用 contains 了(但会破坏所有 linq 代码)。

正确的语法是什么,以便告诉编译器我要使用 String.Contains 方法而不是 Linq 的?

谢谢!


8
当你读错标题时,它会更有趣。 - Ed James
哈哈,确实如此。我猜标题比问题本身更有智慧。 - Magpie
4个回答

9
这是因为BCL中没有定义String.Contains(string, StringComparison)方法,编译器试图使用扩展方法。只有String.Contains(string)方法被定义。

FYI:它是在 .NET 5.0.NET Core 2.1+ 中添加的。 - janv8000

3

1
可能是因为 string.Contains 方法只接受一个参数(一个 string;没有重载的 string.Contains 方法可以接受 StringComparison 值),而 Enumerable.Contains 扩展方法接受两个参数。但是,提供的参数类型与预期的输入类型不匹配,因此编译器会感到困惑。

0
正如Darin Dimitrov所说,String.Contains(string, StringComparison)String类型中不存在。
然而,System.Linq.Enumerable确实包含这样的签名。而且,string也是一个IEnumerable<char>,这就是编译器感到困惑的原因。如果您将StringComparison替换为Char的IComparer,您实际上可以利用Linq并进行编译。
if (myString.Contains(strVar, Comparer<Char>.Default))
{
    // Code here                  
}

1
字符串是一个 IEnumerable<char> - user24359
这样做不行。string 没有实现 IEnumerable<string> - jason
来晚了,但这仍然不起作用。Comparer<T> 没有 实现 IEqualityComparer<T>,所以第二个参数的类型仍然是错误的。似乎没有 char 相当于 StringComparer,所以如果您想使用此扩展方法,可能需要实现自己的比较器。 - wlyles

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接