使用C#和.NET 4.0,我有两个实现内部接口(IMethod)的公共接口(IAsyncMethod和ISyncMethod),我需要将公共访问修饰符设置为前两个,内部设置为第三个,所以我可以只为另一个dll / project / developer启用两个公共接口。
internal interface IPaymentMethod
{
XmlDocument StartTransaction(XmlDocument parameters);
XmlDocument QueryTransaction(XmlDocument parameters);
}
public interface ISyncMethod : IMethod
{
void EndTransaction(TransactionDTO parameter);
}
public interface IAsyncMethod : IMethod
{
void EndTransaction(TransactionDTO parameter);
}
当我构建项目时,我收到这些错误:
Inconsistent accessibility: base interface 'IMethod' is less accessible than interface 'ISyncMethod'
Inconsistent accessibility: base interface 'IMethod' is less accessible than interface 'IAsyncMethod'
我将如何设置修饰符以允许我需要的行为?
答案 0 :(得分:3)
这不是“如何设置修饰符”的问题,而是继承基础的问题:让我们看看(在第三方代码中)
ISyncMethod sm=new ClassImplementingISyncMethod();
IMethod m=(IMethod) sm;
这是有效的,因为ISyncMethod继承自IMethod。如果IMethod不可访问,那么这是不可能的。
有效但不可能是组合,编译器不喜欢。
答案 1 :(得分:0)
类型的所有基础和接口必须至少与该类型一样可见。所以内部/私有类型/接口可以继承/实现公共类型/接口;但不是相反。
考虑一下 - 只从装配中导出某些类型;如果您作为程序集使用者被提供了这些类型,并将IMethod
接口列为接口 - 您会感到难过,因为您希望在某处找到该接口的声明。但由于它是内部的,你不会。
同样,如果类型/接口可以被继承/实现类型破坏,那么可见性修饰符的重点是什么?