WriteLine的重载不会与具有相同签名的委托匹配

时间:2011-11-10 09:06:32

标签: c# delegates

我最近在.NET 3.5中使用委托编写了一些代码来写WriteLine。 在我来到WriteLine的重载(

)之前,使用各种不同的Action代表一切顺利

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&lt; string,object,object,object,object&gt;'

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

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

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

  

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

更奇怪的是,如果我右键单击Console.WriteLine调用错误并说“Go To Definition”,它会转到元数据中的正确版本的WriteLine ,所以为什么它无法将该方法与委托匹配。我在这里做了一些非常愚蠢的事情,或者这是一个已知的问题/特征吗?

1 个答案:

答案 0 :(得分:2)

如果你看一下它显示的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)