如何在不实现其中一个功能的情况下实现接口?

时间:2013-09-17 10:16:52

标签: c# collections tfs-sdk

我注意到TFS API中的一个类中的一个非常奇怪的行为看起来像是破坏了语言的定义。

我试图模仿但没有成功, 我试图实现集合,但不允许使用该类的人调用索引器设置器,就像在WorkitemCollection类中一样。 重要的是错误将在完成时呈现,而不是在运行时,因此异常无效。 WorkitemCollection正在实现一个实现Collection的IReadOnlyList。 根据定义,Collection具有Index Public Get和Set。 但是这段代码返回了一个编译错误:

WorkitemCollection wic=GetWorkitemCollection();
wic[0]=null;

为什么会这样? 提前谢谢。

2 个答案:

答案 0 :(得分:2)

您可以显式实现接口:

int IReadOnlyList.Index
{
    get;
    set;
}

这样,如果没有首先投射对象,就无法调用Index

((IReadOnlyList)myObj).Index

请参阅C# Interfaces. Implicit implementation versus Explicit implementation

答案 1 :(得分:2)

解决方案是显式接口实现。当您使用实现该接口的类时,这实质上使该方法变为私有。但是,仍然可以通过将类的实例强制转换为实现接口来调用它,因此您仍然需要抛出异常。

public class Implementation : IInterface
{
    void IInterface.SomeMethod()
    {
        throw new NotSupportedException();
    }
}

var instance = new Implementation();
instance.SomeMethod(); // Doesn't compile

var interfaceInstance = (IInterface)instance;
interfaceInstance.SomeMethod(); // Compiles and results in the
                                // NotSupportedException being thrown