2017-02-25 105 views
-2

我不能低估,为什么我不能在code bellow中实例化出代表方法Run为什么不能实例化Runate方法的委托?

public class Tester 
{ 
    Media myMedia = new Media(); 
    AudioFile myAu = new AudioFile(); 
    VideoFile myVd = new VideoFile(); 
    //instantiate the delegates 
    Media.PlayerD MyDA = new Media.PlayerD(myAu.AudioPlay); 
    Media.PlayerD MyDV = new Media.PlayerD(myVd.VideoPlay); 

    public void Run() 
    { 
     //call the delegates 
     myMedia.Report(MyDA); 
     myMedia.Report(MyDV); 
    } 
} 
+0

我很抱歉,但我不能让你的要求。你能否重新说明你的问题?你不明白你为什么要在类级别实例化代表,并将它们分配给类的两个字段?你不明白为什么会遵循另一种方法 - 比如将它们安装在称为“Run”的方法体内?谢谢 – Christos

+0

'myMedia'使用的'Media'类型是什么? 'PlayerD'是嵌套在'Media'类型中的委托类型吗?请显示他们的定义(或提供一个链接到他们的文档)。 –

+0

不幸的是,论坛无法编写所有代码。这是书的例子。通过委托传递两个方法,并通过类Tester中的Run()方法调用它。为什么我不能实例化委托出Run()方法? –

回答

0

您:

Media.PlayerD MyDA = new Media.PlayerD(myAu.AudioPlay); 

非静态字段(MyDA以上)的初始化不能使用其他非静态字段(myAu)。

如果您将MyDA = new Media.PlayerD(myAu.AudioPlay);放入非静态构造函数中,将会被允许。

(同为MyDV,当然)。

+0

为什么不能使用?为什么我必须在方法内实例化代表? –

+0

这就是每个C#的设计。设计C#的人决定,如果类的非静态数据依赖于其他非静态数据,则必须在初始化顺序和算法明确的构造函数中设置。看到像[字段初始值设定项不能引用非静态字段,方法或属性](http://stackoverflow.com/questions/14439231/)(您收到的错误消息)等其他线程。 __但你想达到什么?__你也可以用'Media.PlayerD MyDA => myAu.AudioPlay;'创建一个'get'-only属性。但是,每次都会返回一个新实例。 –

相关问题