【问题标题】:No overload of WriteLine matches delegate with same signatureWriteLine 没有重载匹配具有相同签名的委托
【发布时间】:2011-12-26 00:01:45
【问题描述】:

我最近正在编写一些代码来使用 .NET 3.5 中的委托来执行 WriteLine。 使用各种不同的 Action 委托一切都很顺利,直到我遇到了 WriteLine 的重载

public static void WriteLine(string format, object arg0, object arg1, object arg2, object arg3)

由于我使用的是 .NET 3.5,所以没有 Action<T1, T2, T3, T4, T5> 委托,所以我快速编写了自己的:

public delegate void Action<T1, T2, T3, T4, T5>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5);

然后我将 WriteLine 分配给此方法Action<string, object, object, object, object> action = Console.WriteLine; 并收到错误消息

'WriteLine' 没有重载匹配委托'Action'

我认为这一定是由于某些泛型问题造成的,所以我明确声明了一个新委托:

public delegate void WriteLineAction(string format, object arg0, object arg1, object arg2, object arg3);

然后我尝试将 WriteLine 分配给这个新方法并再次收到错误消息:

“WriteLine”没有重载匹配委托“WriteLineAction”

更奇怪的是,如果我右键单击出现错误的 Console.WriteLine 调用并说“转到定义”,它会将我带到元数据中的 WriteLine 的正确版本,所以为什么无法将方法与委托匹配。我在这里做了什么非常愚蠢的事情还是这是一个已知问题/功能?

【问题讨论】:

  • 不确定这是否是您要完成的任务,但如果您正在实施灵活的日志记录,那么您可能需要查看像 NLog 这样的库。它摇滚:)
  • 你是对的,这很奇怪......我只是将 WriteLine 方法的签名复制到一个新的静态类中,当我将委托指向这些时,它工作正常。

标签: c# delegates


【解决方案1】:

如果您查看docs for this overload,它会显示:

此 API 不符合 CLS。符合 CLS 的替代方案是 WriteLine(String, Object[])

如果您查看签名中的 C# 选项卡,它会显示:

C# 不支持使用可变长度参数 (varargs) 的方法。 编译器会自动将此方法的调用解析为使用参数数组的同一方法。

C++ 选项卡将签名显示为:

public:
static void WriteLine(
    String^ format, 
    Object^ arg0, 
    Object^ arg1, 
    Object^ arg2, 
    Object^ arg3, 
    ...
)

我强烈怀疑这是问题所在。在 Reflector 中显示为:

public static void WriteLine(string format, object arg0, object arg1,
    object arg2, object arg3, __arglist)

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-26
  • 2011-04-04
相关资源
最近更新 更多