C#不区分大小写的List.Contains():方法'Contains'的重载没有2个参数
如果这样做,会出现编译器错误
list.Contains(stringToSearchDynamic.ToString(), StringComparer.OrdinalIgnoreCase)
但是如果我们输入实际的字符串,编译就可以了
list.Contains(stringToSearch, StringComparer.OrdinalIgnoreCase)
这是编译器错误吗?
代码:
List<string> list = new List<string>();
list.Add("one");
list.Add("two");
string stringToSearch = "OnE";
dynamic stringToSearchDynamic = "OnE";
//compiles OK
bool isContained = list.Contains(stringToSearch, StringComparer.OrdinalIgnoreCase);
//Does NOT compile
isContained = list.Contains(stringToSearchDynamic.ToString(), StringComparer.OrdinalIgnoreCase);
答案 0 :(得分:6)
2.robot
表达式的类型也是动态的。由于您具有动态变量,因此dynamic
的类型在运行时而不是在编译时解析。因此,它被视为variable.ToString
,并且编译器找不到使用dynamic
作为第一个参数的Contains
方法。
您可以按照注释中的建议将其强制转换为dynamic
,因为强制转换是编译时的事情,并使编译器将变量视为字符串。
答案 1 :(得分:2)
使用简单的强制转换代替ToString()
。无论如何,ToString()
本质上都是无操作的,它只是返回字符串本身。这样编译:
isContained = list.Contains((string)stringToSearchDynamic, StringComparer.OrdinalIgnoreCase);
说明
原始代码试图使用Enumerable.Contains扩展方法,该方法接受比较器作为第二个参数。该方法的签名为Contains<TSource>(IEnumerable<TSource>, TSource, IEqualityComparer<TSource>)
。这意味着要搜索的值本身必须是TSource。不过,在这种情况下,它是dynamic
,直到运行时才知道。
编译器甚至不会尝试使用扩展方法并尝试查找包含列表本身。它发现的是List.Contains(T),它仅接受一个单个参数,并抱怨多个参数
答案 2 :(得分:0)
我正在使用.NetFrameWork 4.7.2,它工作正常,但是由于某些原因,我不得不使用.NetFrameWork 2.0,在这里它给出了类似的错误。因此,如果您可以使用最新的框架版本,则可以提供帮助。