项目A(ClassLibrary1):
有一个类:namespace ClassLibrary1
{
public abstract class HelloBase
{
protected internal abstract void SayHello();
}
}
注意 SayHello 的访问修饰符:protected internal abstract。这个原意可能有两个版本:
1、允许 ClassLibrary1 程序集访问 HelloBase.SayHello 或者让派生类(其他程序集)访问(靠谱)。
2、允许 ClassLibrary1 程序集以及所派生的程序集进行访问(显然不靠谱)。是的,我在其他程序集引用了 ClassLibrary1 并继承 HelloBase
通过 VS 2010 的快捷方式,我得到了: public class HelloClass : ClassLibrary1.HelloBase
{
protected override void SayHello()
{
Console.WriteLine("Hello");
}
}
显然这是没错的。可是,为什么我在研究别人的源码时,发现已编译的程序集竟然存在: public class HelloClass : ClassLibrary1.HelloBase
{
protected internal override void SayHello()
{
Console.WriteLine("Hello");
}
}那么,我该如何让它编译成功?
VS2010 的错误提示如下:错误
“ConsoleTest.HelloClass.SayHello()”: 当重写“protected”继承成员“ClassLibrary1.HelloBase.SayHello()”时,无法更改访问修饰符
有一个类:namespace ClassLibrary1
{
public abstract class HelloBase
{
protected internal abstract void SayHello();
}
}
注意 SayHello 的访问修饰符:protected internal abstract。这个原意可能有两个版本:
1、允许 ClassLibrary1 程序集访问 HelloBase.SayHello 或者让派生类(其他程序集)访问(靠谱)。
2、允许 ClassLibrary1 程序集以及所派生的程序集进行访问(显然不靠谱)。是的,我在其他程序集引用了 ClassLibrary1 并继承 HelloBase
通过 VS 2010 的快捷方式,我得到了: public class HelloClass : ClassLibrary1.HelloBase
{
protected override void SayHello()
{
Console.WriteLine("Hello");
}
}
显然这是没错的。可是,为什么我在研究别人的源码时,发现已编译的程序集竟然存在: public class HelloClass : ClassLibrary1.HelloBase
{
protected internal override void SayHello()
{
Console.WriteLine("Hello");
}
}那么,我该如何让它编译成功?
VS2010 的错误提示如下:错误
“ConsoleTest.HelloClass.SayHello()”: 当重写“protected”继承成员“ClassLibrary1.HelloBase.SayHello()”时,无法更改访问修饰符
解决方案 »
- 求C#工程师帮忙看看这个RTP/MJPEG播放器
- 页面加载成功,但进度条未加载完成
- 有个list,由几个list组合而成……如何让list1,list2,。。。,listN中的这个也删除掉呢?
- 急——C#开发项目后安装部署打包后,在win7 上安装该程序,程序中Access.mdb数据库文件变成只读,问题
- 急,如何绑定数据后过滤?
- 请教一个多文件上传问题(非file field控件选择)
- C#中用正则表达式抽取中文字符?
- axWebBrowser 不能浏览图片链接, - 高分寻解决方法
- checkedit选中后,怎么一直显示对勾呢?用什么去判断它是不是有对勾呢?
- 帮帮小妹!很急!! (在线等待)
- WCF启用流传输的参数怎么办?
- GridView 的选择删除提示
vrhero,这个我明白的。但是我不理解,别人是怎么实现这样的方式?
我直接上图:
---------------------
抽象类:---------------------
派生类:
如果从同一个assembly内进行继承,是继续用protected internal修饰。
vrhero,可是我的源码包也是这样。其他的源码都正常,偏偏这个项目上会存在这个问题?
然后是“故意的捣蛋”?
/addmodule(导入元数据)
比如下面代码将编译出internal protected(注意famorassem修饰)://
// hello.il
// 编译命令:ilasm /dll hello.il
// 需要当前目录有程序集ClassLibrary1.dll
//
.assembly extern ClassLibrary1{}
.assembly extern mscorlib
{
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 )
.ver 2:0:0:0
}.assembly ClassLibrary2{}
.module ClassLibrary2.dll
.subsystem 0x0003 // WINDOWS_CUI
.corflags 0x00000001 // ILONLY.class public auto ansi beforefieldinit Hello
extends [ClassLibrary1]ClassLibrary1.HelloBase
{
.method famorassem hidebysig virtual instance void
SayHello() cil managed
{
ret
} .method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
ldarg.0
call instance void [ClassLibrary1]ClassLibrary1.HelloBase::.ctor()
ret
}
}
protected不带internal的区别就是从当前的程序集非继承不能调用。
如果你不只是好奇,还想要得到internal的效果,那么可以添加一个转发函数,来达到同样的目的:public class Hello : ClassLibrary1.HelloBase
{
protected override void SayHello()
{
} internal void SayHelloInternal() //<---
{
this.SayHello();
}
}
gomoku ,十分感谢您的积极回复。您的精神很令我感动。
我最终还是决定将所有的 protected internal 转换为 public。这个改动量比较小
你只注意了那个程序集,但是忽略了命名空间,仔细看下那两个类虽然不是同一个程序集,但是命名空间都一样,都是“DevExpress.XtraRichEdit.Layout.Export”命名空间哦,哈哈!
{
public void MyPublicMethod( )
{...}
internal void MyInternalMethod( )
{...}
}If you add this line to the AssemblyInfo.cs file of MyClassLibrary.dll: [assembly: InternalsVisibleTo("MyClient")]any client in the assemblies MyClient.dll and MyClient.exe will be able to use MyInternalClass and call its public or internal members. In addition, any subclass in the MyClient assembly will be able to access members ed as protected internal.