为什么公共代表不能通过类实例访问?

Cas*_*211 2 .net c# delegates

我最近发现,如果我有一个表单(比如from2),其中有一个公共委托声明(我知道委托没有附加到任何东西)

namespace SomeTest
{
    public partial class Form2 : Form
    {
        public delegate void mydelegate(string some);

        public Form2()
        {   InitializeComponent();}


        private void Form2_Load(object sender, EventArgs e)
        {        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我传递该表单的实例来说明另一种形式(form1)

namespace SomeTest
{
    public partial class Form1 : Form
    {
        Form2 fm = null;
        public Form1(Form2 fm_)
        {
            this.fm = fm_;
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //Why cant fm access the public delegate ?
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么我们不能像fm.begininvoke(fm.mydelegate,"SomeParameter")我知道代表没有附加某些内容但我只是好奇为什么公共变量无法访问?

McG*_*gle 6

委托是一种类型 - 这就是为什么你可以从类中访问它,而不是从实例访问它.考虑枚举的情况:

public class Foo
{ 
    public enum Bar { A, B, C };
    public Bar Baz;
}
Run Code Online (Sandbox Code Playgroud)

Bar是一个类型,但是Baz是一个对象 - 所以Foo.Bar是有效的,但不是Foo.Baz.同样,如果你有一个实例var foo = new Foo();然后foo.Bar是无效的,但foo.Baz没关系.

您的委托类型mydelegateBar此示例类似.


如果要添加委托的实例:

public partial class Form2
{
    public delegate void mydelegate(string some);
    public mydelegate mydelegateImpl = new mydelegate( arg => Console.WriteLine(arg) );
}
Run Code Online (Sandbox Code Playgroud)

...然后你就可以mydelegateImpl从一个实例访问了Form2.