所以,有人告诉我,在类继承中解决歧义的一个好方法是使用以下习语:
class INewList<T> : IList, IList<T>
{
new T IList<T>.this[int index] { get; set; }
}
我不太了解List<T>.this
语法。这与简单的做法有何不同:
new T this[int index] { get; set; }
这两个功能上有什么不同吗?在前面的示例中,我是否需要稍后为索引器提供实现,或者此代码只是告诉编译器“嘿,在有疑问时使用IList<T>
中的索引器实现”?
答案 0 :(得分:3)
这叫做explicit implementation。当您显式实现接口成员时,它只能通过该类型的引用(或子类型,见下文)调用,换句话说,IList
(非泛型)引用将无法打电话给你的第一个例子。
以下是子类型工作原理的示例:
void Main() {
I2 myC = new C();
myC.Operation();
}
interface I1 {
void Operation();
}
interface I2 : I1 { }
class C : I2 {
void I1.Operation() {
Console.WriteLine ("called operation");
}
}
如果执行此操作,您将看到控制台输出。如果myC
被声明为C
,则无效。
(已更新以添加示例)
答案 1 :(得分:0)
这是this
作为IList<T>
的实施者的引用
否则你无法从这个属性返回T
,因为对于“普通”ILIst
答案 2 :(得分:0)
Interface.XYZ
语法this
,因此它变为Interface.this
答案 3 :(得分:0)
它被称为explicit interface implementation,它用于解决实现两个碰巧共享成员名称的接口等问题。 基本上,它只是在将对象强制转换为特定接口时才能调用的方法。
说:
INewList<int> myList = new NewList<int>();
myList[1] = 2; // Error, this[int index] is not implemented.
IList<int> myList2 = myList; // Cast as IList<int>
myList2[1] = 2; // Succeeds, it'll call IList<T>.this[int index].
IList myList3 = myList; // Cast as IList
myList3[1] = 2; // Error, neither this[int index] nor IList.this[int index] are not implemented.
当然,如果你已经实现了DID,它会调用相应的方法,显式实现会覆盖任何隐含的方法。
答案 4 :(得分:0)
您的代码示例非常混乱,无法编译。但是,要回答有关List<T>.this
语法的问题:
这称为显式接口实现。您可以使用它来实现接口,但将其隐藏在类的公共签名中。这是一个小例子:
public class Foo : IDisposable {
public void Dispose() {
}
}
public class Bar : IDisposable {
public void Close() {
}
void IDisposable.Dispose() {
Close();
}
}
这两个类都实现了IDisposable
,但要处置Bar
,您必须调用Close
。您也可以将其投放到IDisposable
,然后拨打Dispose
。
var foo = new Foo();
foo.Dispose();
var bar = new Bar();
bar.Close();
((IDisposable) bar).Dispose();
对于课程Foo
和Bar
,如果清除方法调用Dispose
或Close
,则可能不重要,但对于File
课程,您可能更喜欢改为Close
而不是Dispose
。其他用途是隐藏您必须实现的接口以参与对象之间的交互,但您不希望您的类的消费者看到它。或者您可以使用它来解决使用冲突方法实现多个接口的问题。
您可以在MSDN上阅读explicit interface implementation。