在JScript.NET中转换为委托类型失败

在JScript.NET中转换为委托类型失败,.net,jscript.net,.net,Jscript.net,我试图在JScript.NET中使用BeginRead()执行异步IO,但无法使回调函数正常工作 代码如下: function readFileAsync() { var fs : FileStream = new FileStream( 'test.txt', FileMode.Open, FileAccess.Read ); var result : IAsyncResult = fs.BeginRead( new byte[8], 0, 8, readFileCallbac

我试图在JScript.NET中使用BeginRead()执行异步IO,但无法使回调函数正常工作

代码如下:

function readFileAsync() {
    var fs : FileStream = new FileStream( 'test.txt', FileMode.Open, FileAccess.Read );
    var result : IAsyncResult = fs.BeginRead( new byte[8], 0, 8, readFileCallback ), fs );
    Thread.Sleep( Timeout.Infinite );
}

var readFileCallback = function( result : IAsyncResult ) : void {
 print( 'ListenerCallback():' );
}
例外情况是强制转换失败:

Unhandled Exception: System.InvalidCastException: Unable to cast object of type 'Microsoft.JScript.Closure' to type 'System.AsyncCallback'.
at JScript 0.readFileAsync(Object this, VsaEngine vsa Engine)
at JScript 0.Global Code()
at JScript Main.Main(String[] )
我尝试过对AsyncCallback和基本MulticastDelegate和委托类型进行显式转换,但没有成功

委托应该自动创建,无需显式创建新的AsyncCallback,例如:

BeginRead( ... new AsyncDelegate( readFileCallback), object );

事实上,如果您试图显式地创建委托,编译器会发出一个错误。我在这里肯定遗漏了什么。

问题源于这样一个事实,即内部委托是使用

Delegate.CreateDelegate( Type, Object, String ) 
其中Type是要创建的委托类型,Object是将在其上调用方法的实例,String是方法的名称。为了使其工作,函数必须是实例方法,因此我们必须定义这样的类:

class AsyncFileReader 
{
    function readFileAsync() {
        var fs : FileStream = new FileStream( 
            'test.txt', FileMode.Open, FileAccess.Read 
        );

        var result : IAsyncResult = fs.BeginRead( 
            new byte[8], 0, 8, ListenerCallback, fs 
        );
        // Sleep just for testing
        Thread.Sleep( Timeout.Infinite );
    }

    function ListenerCallback( result : IAsyncResult ) : void {
        print( 'ListenerCallback():' );
    }

} // class
由于回调现在可以在运行时绑定到AsyncFileReader的实例,因此转换将成功。上面列出的错误很可能是我在显式强制转换中的一次尝试,而在这里的转换过程中并没有发生这种情况