关于c#类之间可访问性问题
class a{
}
public class b
{
public a aa=new a();//告诉有错,类型a与b字段b.aa级别不同 要是把public 换成Internal 或private 就没有错。
如果把 public class b 中的Public 去掉也没有错了。希望你们也试试,我不是特别清楚。请高人指典。
} --------------------编程问答-------------------- a是一个internal的类型,所以这个类型的字段aa不能作为public类的public字段,这会导致访问不到类型a的地方能访问到字段aa,而这个时候字段aa的类型是不可见的,这是不允许的。如果字段aa所在的类是internal的(即把class b前面的public去掉)或者这个字段aa本身是internal的,就没问题了。 --------------------编程问答-------------------- 这就好比是你说你有一个手机在你的手上,可是别人却看不到你的手机,因为你的手机是隐身的.
你要想让别人看到你的手机,那么你就要把它拿到公众面前来,说这是你的手机. --------------------编程问答-------------------- 不写,默认是private的,这样就是说对外不公开这个类,但你的b是公开的,就是说外部可以用访问到b,但你的b类不能公开a类的对象,因为a类型是private的,如果公开。编译器就不知道你的a类到底要不要公开。
你声明和调用,都统一成private,public,internal就没问题的了。 --------------------编程问答-------------------- 在一个类里公开另一个类型的时候,另一个类型的公开程序要大于等于你这个类才行. --------------------编程问答-------------------- 讲得太清楚了 --------------------编程问答-------------------- 看得我 眼冒金星 哈哈~~ --------------------编程问答-------------------- Q1:
A:
1.Class a 为internal的.
2.Class b 为public.
在public的类里不能将a 申明为public(因为本身a 就不可能为public),即你只能申明a为比它本身修饰符低的或者同级的.如private,internal.
Q2:
A:
将Class b的public修饰符去掉,则b于a都属于同一级别了,可以互相访问.
结合“hbxtlhx(平民百姓)”说的:
在一个类里公开另一个类型的时候,另一个类型的修饰符级别要>=你这个类型的修饰符级别才行. --------------------编程问答-------------------- up --------------------编程问答-------------------- 还不是特别明白, class a的类型怎么是Internal 默认不是Private --------------------编程问答-------------------- 默认类型是internal,这个是C#的规则,而且类好像不能定义为private和protected。
一个internal类如果在public类中产生public的实例,那么就代表这个类的对象的内容可以被外部项目访问,这与这个类的internal类型语义相冲突,所以无法编译。
总结起来就是楼上几位所说的:
在一个类里公开另一个类型的时候,另一个类型的修饰符级别要>=你这个类型的修饰符级别。 --------------------编程问答-------------------- 帮顶~~ --------------------编程问答-------------------- 定义的访问级别要和调用时一致,或公用性小于定义,一般定义时都是internal 或public不然要报错,这个还需要问原因吗? --------------------编程问答-------------------- using System;
inte易做图ce ISampleInte易做图ce
{
void SampleMethod();
}
class ImplementationClass : ISampleInte易做图ce
{
public void SampleMethod()
{
System.Windows.Forms.MessageBox.Show("test2");
}
static void Main()
{
ImplementationClass t=new ImplementationClass();
//ISampleInte易做图ce isi=(ISampleInte易做图ce)t;
//t.ISampleInte易做图ce.SampleMethod();
t.SampleMethod();
}
}
但是我这样也没有申明啊,但是程序没什么问题,我想是不是显示调用的问题.. --------------------编程问答-------------------- ls的
你的t又没有修饰成public,怎么会有问题 --------------------编程问答-------------------- class的默认访问修饰符是internal,class的内部成员默认访问修饰符才是private
其他的hbxtlhx(平民百姓)已经讲得很清楚了
补充:.NET技术 , C#