无法将“方法组”转换为“Func<string, string, bool>”。

13

我正在实现一个非常简单的规则引擎,它可以在运行时动态地强制执行一些规范。

实际的规则存储在元组中,我遇到了存储指向 string.EndsWith 函数的委托的问题。

以下代码用于测试字符串相等性,并按预期返回 False"A""B" 不同):

var rule = new Tuple<string, Func<string, string, bool>, string>("A", string.Equals, "B");
Console.WriteLine(rule.Item2.Invoke(rule.Item1, rule.Item3));

然而,我无法弄清如何调整此代码以使用string.EndsWith函数,而不是string.Equals

以下代码无法编译,并在Visual Studio中发出Cannot convert from 'method group' to 'Func<string, string, bool>错误消息。

var rule = new Tuple<string, Func<string, string, bool>, string>("A", string.EndsWith, "B");
Console.WriteLine(rule.Item2.Invoke(rule.Item1, rule.Item3));

在提问之前,我进行了搜索,但我不能理解如何解决“编译器错误 - 无法将方法组转换为System.Delegate”? 或者无法将方法组转换为System.Func<string>中提供的答案。我不知道如何将它们应用到我的问题上。


2
只需查看该方法的签名。它们中没有一个与委托匹配,正如错误消息所告诉您的那样。 - Servy
还有,让我们从string.EndsWith开始说起 - 没有这样的方法,也就是说以下代码无法编译通过:bool test = string.EndsWith("ABC", "C");,对吗? - Ivan Stoev
@Servy 我以为错误信息告诉我了另外一件事情。但现在有道理了,你是对的。 - Laurent Vaylet
@IvanStoev 您说得非常正确。我错误地假定这些方法遵循相同的模式。 - Laurent Vaylet
1个回答

7

String.EqualsString.EndsWith有不同的方法签名,需要不同的调用方式。

具体来说,String.Equals是静态方法,接受两个字符串并返回一个bool值。而String.EndsWith是实例方法,接受一个字符串并返回一个bool值。

您可以通过将String.EndsWith调用包装在lambda中来解决此问题,以更改签名以接受两个字符串并返回一个bool值:

var rule = new Tuple<string, Func<string, string, bool>, string>
    ("AB", (string a, string b) => a.EndsWith(b), "B");
Console.WriteLine(rule.Item2.Invoke(rule.Item1, rule.Item3));

通常情况下,这个错误意味着编译器无法将 string.EndsWith 解释为一个 Func<string, string, bool>。您可能会发现这个关于什么是方法组的回答有所帮助,以理解错误信息。


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