我注意到TFS API中的一个类中的一个非常奇怪的行为看起来像是破坏了语言的定义。
我试图模仿但没有成功, 我试图实现集合,但不允许使用该类的人调用索引器设置器,就像在WorkitemCollection类中一样。 重要的是错误将在完成时呈现,而不是在运行时,因此异常无效。 WorkitemCollection正在实现一个实现Collection的IReadOnlyList。 根据定义,Collection具有Index Public Get和Set。 但是这段代码返回了一个编译错误:
WorkitemCollection wic=GetWorkitemCollection();
wic[0]=null;
为什么会这样? 提前谢谢。
答案 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