【发布时间】:2011-05-26 21:29:49
【问题描述】:
考虑下面的代码。看起来像完全有效的 C# 代码对吧?
//Project B
using System;
public delegate void ActionSurrogate(Action addEvent);
//public delegate void ActionSurrogate2();
// Using ActionSurrogate2 instead of System.Action results in the same error
// Using a dummy parameter (Action<double, int>) results in the same error
// Project A
public static class Class1 {
public static void ThisWontCompile() {
ActionSurrogate b = (a) =>
{
a(); // Error given here
};
}
}
我收到一个编译器错误“委托‘操作’不接受 0 个参数。”使用 (Microsoft) C# 4.0 编译器在指定位置。请注意,您必须在不同的项目中声明 ActionSurrogate 才能显示此错误。
变得更有趣了:
// Project A, File 1
public static class Class1 {
public static void ThisWontCompile() {
ActionSurrogate b = (a) => { a(); /* Error given here */ };
ActionSurrogate c = (a) => { a(); /* Error given here too */ };
Action d = () => { };
ActionSurrogate c = (a) => { a(); /* No error is given here */ };
}
}
我是不是在这里偶然发现了一个 C# 编译器错误?
请注意,对于非常喜欢使用 lambdas 并试图创建一个数据结构库以供将来使用的人来说,这是一个非常烦人的错误......(我)
编辑:删除错误的情况。
为了实现这一点,我复制并精简了我的原始项目。这实际上是我新项目中的所有代码。
【问题讨论】:
-
有趣的是,在您的第二个示例中,Class2 可以编译,而在您的第一个示例中,完全相同的代码会中断。
-
您是否有可能在某处对
Action有不同的定义? -
@Anon.: Class2 原本在 Project B 中,所以没有报错。我刚刚对其进行了测试,在项目 A 中使用不同的文件没有区别。
-
我得到了一个更复杂的版本:stackoverflow.com/questions/3276578/… ... 并在 MS connect 上作为问题提交:connect.microsoft.com/VisualStudio/feedback/details/577938/… .... 但是,这是一个更简单的重现步骤.希望它会在 SP1 中得到修复。
-
查看 Jon Skeet 发布的代码,您似乎遇到了完全相同的错误,这让我很好奇他们是否在阅读您的报告后发现了导致错误的原因...
标签: c# compiler-errors lambda compiler-bug