【问题标题】:Cannot convert from 'method group' to 'Func<string, string, bool>'无法从“方法组”转换为“Func<string, string, bool>”
【发布时间】:2016-02-11 01:24:34
【问题描述】:

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

实际规则存储在元组中,我无法将委托存储到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&lt;string, string, bool&gt;' 错误消息。

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

我在问这个问题之前做了搜索,但我无法理解How do I fix 'compiler error - cannot convert from method group to System.Delegate'?Cannot convert from method group to System.Func<string> 中提供的答案。我不知道如何将这些应用于我的问题。

【问题讨论】:

  • 只看方法的签名。它们都不匹配委托,正如错误消息告诉你的那样。
  • 也让string.EndsWith开始——没有这样的方法,即下面的不会编译bool test = string.EndsWith("ABC", "C");,对吧?
  • @Servy 我认为错误消息告诉我一些不同的东西。但现在说得通了,你是对的。
  • @IvanStoev 你是完全正确的。我错误地认为这些方法遵循相同的模式。

标签: c# .net


【解决方案1】:

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

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

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

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&lt;string, string, bool&gt;。你可以找到这个answer about what is a method group helpful 来理解错误信息。

【讨论】:

    猜你喜欢
    • 2011-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-31
    • 2022-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多