本帖最后由 bdmh 于 2014-08-01 12:44:31 编辑

解决方案 »

  1.   

    public event fun1Delegate newEvent;
    public使得newEvent可以被他人使用。
    如果他不知道newEvent的类型(fun1Delegate)是什么,如何使用它?
      

  2.   

    委托倒不一定要public,这样也可以:    public class Test1
        {
            private String name;
            public String Name
            {
                get { return name; }
                set { name = value; newEvent(this, new newEventEventargs(name)); }
            }
            private delegate void fun1Delegate(Test1 sender, newEventEventargs e);
            private event fun1Delegate newEvent;
        }
      

  3.   

    事件是对委托的一个类型安全的封装,外面访问事件其实就是访问委托,否则都不知道参数(Test1 sender, newEventEventargs e)
      

  4.   

    event是public的,外部绑定注册不都是event,没有直接对委托操作吧
      

  5.   

    只是个逻辑问题:
    如果你想让别人用你的newEvent,那newEvent的类型当然也必须是public的,不然他怎么用呢。。
    如果你不想让别人就,就把newEvent定义成private的其实这算是error还是warning只是微软程序员的一念之差而已= =
      

  6.   

    我明白楼主的目的,思考后得出
    private delegate void MyDelegate(object arg);//MyDelegate是private的~ 也就是说外面不知道
    public event MyDelegate MyEvent;//这个MyEvent的类型(签名)是MyDelegate,但上面的MyDelegate是private
    也就是说外面的调用者只知道MyEvent,但不知道MyEvent的类型(签名)是什么~
    而C#是强类型语言~所以下面代码报同样的错误
            private class InnerClass { };
            public InnerClass MyClass { get; set; }
      

  7.   

    完整代码
        class Program
        {
            private delegate void MyDelegate(object arg);
            public event MyDelegate MyEvent;        private class InnerClass { };
            public InnerClass MyClass { get; set; }
    }
      

  8.   

    个人认为是外部在给你的newEvent赋值的时候需要声明一个
    private delegate void fun1Delegate(Test1 sender, newEventEventargs e);类型的函数,如果你不公开该类型,外部无法获取。把private delegate void fun1Delegate(Test1 sender, newEventEventargs e);放在类外部则同一个命名空间的其它类应该可以调用。
      

  9.   

    其实我这边的重点并不是你说的东西,我只是说既然事件是对委托的封装,把事件定义成public就可以了,就和属性和字段一样,外部只是对公开的事件进行注册,5楼还有9楼不知道谁说的是根本原因
      

  10.   

    可能就是你说的这样,毕竟委托编译后也是一个类,http://www.cnblogs.com/chenleiustc/archive/2009/07/15/1523914.html这个链接讲的就是你说的
      

  11.   

    本质上可能是因为public event MyDelegate MyEvent,该事件编译完成后会生成private event MyDelegate MyEvent=null;和一个add_MyEvent(MyDelegate  value)方法、和一个remove_MyEvent(MyDelegate  value)方法,外部虽然直接对public的event进行注册,但是注册其实是调用了add_MyEvent方法来注册,需要传递MyDelegate 类型的实参,而如果委托是private delegate void fun1Delegate(Test1 sender, newEventEventargs e);则该内嵌的private fun1Delegate类是无法访问到的,所以很可能在运行时引起传递的参数类型不一致,所以我觉得编译器报这个错,根本原因是“返回类型和方法的形参表中引用的各个类型必须至少具有和方法本身相同的可访问性”,而不仅仅是针对于委托有这种情况
      

  12.   

    可以public可以internal,具体看你的委托的使用范围,调用它的地方能访问到就行了。