Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 编译器为匿名方法生成了不正确的代码[MS BUG FIXED]_C#_.net_Delegates_Cil_Anonymous Methods - Fatal编程技术网

C# 编译器为匿名方法生成了不正确的代码[MS BUG FIXED]

C# 编译器为匿名方法生成了不正确的代码[MS BUG FIXED],c#,.net,delegates,cil,anonymous-methods,C#,.net,Delegates,Cil,Anonymous Methods,请参阅以下代码: public abstract class Base { public virtual void Foo<T>() where T : class { Console.WriteLine("base"); } } public class Derived : Base { public override void Foo<T>() { Console.WriteLine("deri

请参阅以下代码:

public abstract class Base
{
    public virtual void Foo<T>() where T : class
    {
        Console.WriteLine("base");
    }
}

public class Derived : Base
{
    public override void Foo<T>()
    {
        Console.WriteLine("derived");
    }

    public void Bang()
    {
        Action bang = new Action(delegate { base.Foo<string>(); });
        bang();    //VerificationException is thrown
    }
}
以及编译器生成的方法的签名:

method private hidebysig 
    instance void '<>n__FabricatedMethod1'<T> () cil managed 
{
    .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
        01 00 00 00
    )       
    .maxstack 8

    IL_0000: ldarg.0
    IL_0001: call instance void ConsoleApp.Base::Foo<!!T>()
    IL_0006: ret
}
编辑我正在windows8 RTM、.net framework 4.5中使用VS2012 RTMRel


编辑此错误现已修复。

首先-这是一种可能的修复方法,但可能不是您问题的答案。(但注释没有代码格式)

我相信这与此类似:,因为您使用Foo()方法作为变量,并且.NET中存在一个bug(或者可能是一个特性)

我已尝试将Bang()方法更改为

public void Bang()
{
    Action baseMethod = base.Foo<string>;
    Action bang = new Action(delegate { baseMethod(); });
    bang();    //VerificationException is thrown
}
public void Bang()
{
Action baseMethod=base.Foo;
Action bang=新操作(委托{baseMethod();});
bang();//抛出了VerificationException
}
它是有效的,结果是“基础”


我希望它能帮上一点忙。

它被确认为一个bug,并且


更新:连接项目不再存在。该错误已修复。

您的代码适合我。您使用的是哪个版本的C#/.Net/Visual Studio?您的目标平台是哪一个?来自PEVerify的输出表明编译器确实存在错误<代码>[IL]:错误:[ConsoleApplication3.exe:ConsoleApplication3.Derived::n__-factedMethod1[T]][offset 0x00000001]无法解析令牌。验证ConsoleApplication3.exe时出现1个错误我认为,根据到目前为止的评论,您可以相当安全地说您发现了一个bug,并用它回答您自己的问题。除了编译器错误之外,这可能是任何其他错误的唯一方式是,如果语言规范不允许在委托中调用
base
方法(我没有检查),但即使如此,缺少正确的诊断也是编译器中缺少的一个需要的特性。(当然要向微软报告。)@leppie:向微软报告,票号:766845@TheDag委托{}语法不是创建了一个额外的匿名方法,然后调用Foo,其中作为新操作(base.Foo)直接调用Foo而不需要额外的间接寻址吗?仅供参考,注释确实有代码格式,你不能包括换行符,而且仍然受到字符总数(包括减价)的限制。遗憾的是,我们永远都不知道什么时候会收到。微软真的应该在那个网站上更好地沟通。。。
Action good = new Action(base.Foo<string>());
good();  //fine
public void Bang()
{
    Action baseMethod = base.Foo<string>;
    Action bang = new Action(delegate { baseMethod(); });
    bang();    //VerificationException is thrown
}