我注意到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方法而不是Linqs的正确语法是什么?
干杯
答案 0 :(得分:7)
这是因为BCL中没有定义String.Contains(string, StringComparison)
方法,编译器尝试使用扩展方法。只定义了String.Contains(string)方法。
答案 1 :(得分:2)
告诉编译器我想使用
String.Contains
方法而不是Linqs的正确语法是什么?
String.Contains
没有超载接受StringComparision
。您可能想要使用String.IndexOf(string, StringComparison)
:
// s is string
if(s.IndexOf(strVar, StringComparison.OrdinalIgnoreCase) >= 0) {
// code here
}
答案 2 :(得分:1)
可能是因为string.Contains
方法只接受一个参数(string
; string.Contains
没有重载需要StringComparison
值,而Enumarable.Contains
{1}}扩展方法需要两个。但是,您提供的参数不符合预期的输入类型,因此编译器会感到困惑。
答案 3 :(得分:0)
正如Darin Dimitrov所说,String.Contains(string, StringComparison)
作为String
类型的方法不存在。
System.Linq.Enumerable
确实包含这样的签名。而string
也是IEnumerable<char>
,这就是编译器混淆的原因。如果你用Char
的ICompar- er 替换StringCompar- ison ,你实际上可以利用Linq并进行编译:
if (myString.Contains(strVar, Comparer<Char>.Default))
{
// Code here
}