代表上的C#Parser Bug?

时间:2011-04-19 14:06:08

标签: c# compiler-errors

  

可能重复:
  'Delegate 'System.Action' does not take 0 arguments.' Is this a C# compiler bug (lambdas + two projects)?

当我做一个使用大量lambda用法的测试框架时,我偶然发现了一个解析器错误。

public class CSpecTestRunnerSpec : CSpecFacade<CSpecTestRunner>
{
    public CSpecTestRunnerSpec()
        : base(new CSpecTestRunner())
    {
        CreateOperations();
    }

    private MyClassSpec myClassSpec;
    private DescribeAll run_on_type;

    protected override void BeforeOperation()
    {
        myClassSpec = new MyClassSpec();
    }

    private void CreateOperations()
    {
        run_on_type =
           (@it, @do) =>
           {
               @it("Runs all of the operations contained in a type");
               @do.RunTestOnType(myClassSpec.GetType());
           };
    }

DescribeAll委托来自基类,它的界面如下:

编辑代码如下:

public delegate void DescribeAll(Action<string> description, TClass objSpec);

我得到的例外是“委托行动不接受1个参数”但它完全有效!并在我的班级代码中添加一个虚拟委托后:

    private Action<string> dummy;

它开始起作用了。 : - )

相比之下,相同的代码在单声道中没有错误的情况下工作,没有虚拟委托,它在使用NET 3.5和4.0的多台机器上进行了测试。

所以我的问题是,这是编译器方面还是我方的错误?以及如何解决问题?

p.s框架在codeplex上,因此您可以获得完整的代码并自行测试。

2 个答案:

答案 0 :(得分:6)

UPDATE:

该错误已在C#5修复。再次为此带来不便,并感谢报告。


这是编译器中的已知错误,但它不在解析器中;它位于语义分析器和元数据导入缓存之间的交互中。我对错误的分析是:

'Delegate 'System.Action' does not take 0 arguments.' Is this a C# compiler bug (lambdas + two projects)?

这是我的错;我带来的不便表示歉意。我们将尝试为下一个版本修复它。

答案 1 :(得分:2)

有一个不带参数的委托类型Action。我想你想要Action<T>

public delegate void DescribeAll(Action<string> description, TClass objSpec);

public delegate void DescribeAll(Action<object> description, TClass objSpec);

public delegate void DescribeAll<T>(Action<T> description, TClass objSpec);