【发布时间】:2012-02-03 11:46:40
【问题描述】:
作为在我正在开发的库中引入惰性格式评估的一种方法,我定义了委托
public delegate string MessageFormatterDelegate(string message, params object[] arguments);
public delegate string MessageFormatterCallback(MessageFormatterDelegate formatterDelegate);
以及类似以下课程的内容
public static class TestClass
{
public static string Evaluate(MessageFormatterCallback formatterCallback)
{
return (formatterCallback(String.Format));
}
}
然而,这已经够奇怪了:当从 external 项目运行时,语句
Console.WriteLine(TestClass.Evaluate(message => message("{0},{1},{2}", 1, 2, 3)));
没有编译,错误提示失败
Error 1 Delegate 'MessageFormatterDelegate' does not take 4 arguments
同时
Console.WriteLine(TestClass.Evaluate((MessageFormatterDelegate message) => message("{0},{1},{2}", 1, 2, 3)));
编译和工作没有问题,在控制台中打印1,2,3。为什么我必须在第二个 lambda 表达式中使用 MessageFormatterDelegate 类型限定 message 参数?有没有办法规避这种行为?
【问题讨论】:
-
有趣。看起来像某种错误。您是否使用所有不同的 C# 编译器版本对此进行了测试以查看它是否已修复?
-
谢谢leppie。事实上,我已经在新安装了 SP1 的 Visual Studio 2010 Express Edition 下对其进行了测试。
-
@DotNetStudent:它在那里工作吗,或者它对你来说是失败的地方?应该没问题 - 看看我的回答。
-
对不起乔恩。我忘了在第一篇文章中添加“外部项目”部分!在同一个项目中它可以工作,但不是来自外部项目。
-
@leppie:推断 lambda 表达式委托类型。 ((c)乔恩·斯基特:-P)