不区分大小写的List.Contains():方法'Contains'的重载没有2个参数

时间:2019-03-18 08:00:12

标签: c#

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);

3 个答案:

答案 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,在这里它给出了类似的错误。因此,如果您可以使用最新的框架版本,则可以提供帮助。