WEB开发网
开发学院软件开发C语言 C#里,派生类的方法里的匿名delegate调用基类的方... 阅读

C#里,派生类的方法里的匿名delegate调用基类的方法会产生无法验证的代码

 2009-06-04 08:30:17 来源:WEB开发网   
核心提示: 当然这只是伪代码,C#中并没有"__nonvirtual__"关键字,C#里,派生类的方法里的匿名delegate调用基类的方法会产生无法验证的代码(5),一般来说,C#中的方法调用都是通过callvirt的IL指令完成的;而通过base关键字所做的方法调用则不遵循虚函

当然这只是伪代码。C#中并没有"__nonvirtual__"关键字。一般来说,C#中的方法调用都是通过callvirt的IL指令完成的;而通过base关键字所做的方法调用则不遵循虚函数要使用最具体版本的规则,因而使用的是call的IL指令来完成。这里所谓"__nonvirtual__"就是要表现这个意思。

可以看到,原本代码中匿名delegate里对base的访问,实际上被生成到了另外一个类(私有内部类)的方法中,而那个类的"base"其实应该是System.Object……于是就有问题了。关键字“base”本来应该只能在同一个继承系的派生类中使用,这样生成的代码就像是让“base”的作用范围泄露了一般。没错,编译出来的代码确实是能运行,却变得不可验证(unverifiable)。

但这并不是使用.NET Framework的程序员的错;他们只是想在正确的地方正确的使用base而已。所以.NET Framework的应对方法是给出一个警告信息,提醒程序员修改代码来避开这个问题。不幸的是,Mono并没有提供任何警告提示。用Mono 1.2.5.1编译上面的代码,并用.NET Framework的PEVerify来验证,会看到下面的错误信息:

引用

Microsoft (R) .NET Framework PE Verifier.  Version  3.5.20706.1
Copyright (c) Microsoft Corporation.  All rights reserved.

[IL]: Error: [F:FXsharetestClosure.exe : Bravo+<>c__CompilerGenerated0::<Charlie>c__1][offset 0x00000011] The 'this' parameter to the call must be the calling method's 'this' parameter.
1 Error Verifying testClosure.exe

上一页  1 2 3 4 5 6  下一页

Tags:派生 方法 匿名

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接