无法从“方法组”转换为“ FUNC <字符串,字符串,布尔>”

Lau*_*let 6 .net c#

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

实际的规则存储在Tuples中,我在存储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));
Run Code Online (Sandbox Code Playgroud)

但是,我无法弄清楚如何修改此代码以使用string.EndsWith功能代替string.Equals

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

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

我在询问此问题之前进行了搜索,但是我无法理解如何修复“编译器错误-无法从方法组转换为System.Delegate”中提供的答案无法从方法组转换为System.Func <string>。我看不到如何将这些应用于我的问题。

Dan*_*iel 5

String.EqualsString.EndsWith具有不同的方法签名,必须以不同的方式调用。

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

您可以通过在lambda中包装String.EndsWith调用来更改签名以采用两个字符串并返回布尔值来解决问题:

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));
Run Code Online (Sandbox Code Playgroud)

通常,该错误意味着编译器无法将其解释string.EndsWithFunc<string, string, bool>。您可能会找到关于什么是有助于理解错误消息的方法组的答案