如何限制对其他公共接口实现的内部接口的访问

时间:2012-01-17 13:28:33

标签: c# .net .net-4.0

使用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'

我将如何设置修饰符以允许我需要的行为?

2 个答案:

答案 0 :(得分:3)

这不是“如何设置修饰符”的问题,而是继承基础的问题:让我们看看(在第三方代码中)

ISyncMethod sm=new ClassImplementingISyncMethod();
IMethod m=(IMethod) sm;

这是有效的,因为ISyncMethod继承自IMethod。如果IMethod不可访问,那么这是不可能的。

有效但不可能是组合,编译器不喜欢。

答案 1 :(得分:0)

类型的所有基础和接口必须至少与该类型一样可见。所以内部/私有类型/接口可以继承/实现公共类型/接口;但不是相反。

考虑一下 - 只从装配中导出某些类型;如果您作为程序集使用者被提供了这些类型,并将IMethod接口列为接口 - 您会感到难过,因为您希望在某处找到该接口的声明。但由于它是内部的,你不会。

同样,如果类型/接口可以被继承/实现类型破坏,那么可见性修饰符的重点是什么?