2

我最近发现,如果我有一个表单(比如 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)
        {        }
    }
}

现在,如果我通过该表单的一个实例来说出另一个表单(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 ?
        }
    }
}

为什么我们不能像fm.begininvoke(fm.mydelegate,"SomeParameter")我知道委托没有附加到某些东西一样去,但我只是好奇为什么公共变量不可访问?

4

2 回答 2

6

委托是一种类型——这就是为什么您可以从类访问它,但不能从实例访问它。考虑枚举的情况:

public class Foo
{ 
    public enum Bar { A, B, C };
    public Bar Baz;
}

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) );
}

...然后您就可以mydelegateImplForm2.

于 2012-11-17T07:05:02.347 回答
3

您可以访问它,您只需使用类名而不是实例名。

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)
        {
            Form2.mydelegate // Works.
            fm.mydelegate    // Won't work. 
        }
    }
}

为什么?因为委托不是字段或属性。在类中定义委托更类似于在类中定义类。你知道这是可能的吗?

namespace SomeTest
{
    public delegate void mydelegate(string some);

    public partial class Form2 : Form
    {

        public Form2()
        {   InitializeComponent();}


        private void Form2_Load(object sender, EventArgs e)
        {        }
    }
}
于 2012-11-17T07:01:03.140 回答