我最近在.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 ,所以为什么它无法将该方法与委托匹配。我在这里做了一些非常愚蠢的事情,或者这是一个已知的问题/特征吗?
答案 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)