标签:
写字段的时候一般会这么写:
1 private string _msg; 2 3 public string Msg 4 { 5 get { return _msg; } 6 set { _msg = value; } 7 }
或者直接自动属性,反编译后其实也生成了一个私有字段,即
1 public string Msg { get; set; }
于是昨天在写委托实例的时候这么写:
1 delegate void AfterSendMsg(string msg); 2 public AfterSendMsg AfterSendMsgDel { get; set; }
不论委托是不写修饰符,还是写private,这样的代码都会报出AferSendMsg访问修饰符低于AferSendMsgDel。
自己没想出来,在csdn上倒是看到了一个人问过很类似的问题,具体问题如下:
1 public class Test1 2 { 3 private String name; 4 public String Name 5 { 6 get { return name; } 7 set { name = value; newEvent(this, new newEventEventargs(name)); } 8 } 9 private delegate void fun1Delegate(Test1 sender, newEventEventargs e); 10 public event fun1Delegate newEvent; 11 }
这样编译会报错,说可访问性不一致: 字段类型“ConsoleApplication1.Test1.fun1Delegate”比字段“ConsoleApplication1.Test1.newEvent”的可访问性低”
也就是一定要把委托声明成public delegate void fun1Delegate(Test1 sender, newEventEventargs e);
内部委托为何一定要public,它不是不需要对外有任何操作吗?我不清楚为什么一定要这样
============================================================================================
原因:(当你在一个访问性比较强(例如公共)的字段/属性/方法里使用自定义类型,而这个类型访问性比较低(例如保护/私有)的时候就发生这个问题了)
例如以下均会出错:
1 class Program 2 { 3 private delegate void MyDelegate(object arg); 4 public event MyDelegate MyEvent; 5 6 private class InnerClass { }; 7 public InnerClass MyClass { get; set; } 8 }
比如一个类用program这个类里边MyClass这个属性,虽然这个属性是公开的,但他的类型是不公开的,所以报访问不一致,解决方案private改public。
参考:http://bbs.csdn.net/topics/390848792
http://www.cnblogs.com/chenleiustc/archive/2009/07/15/1523914.html
标签:
原文地址:http://www.cnblogs.com/shiling/p/4590205.html