4

所以,有人告诉我,解决类继承中的歧义的一个好方法是使用以下成语:

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>在有疑问时使用索引器实现”?

4

5 回答 5

3

这称为显式实现。当您显式实现接口成员时,只能通过该类型(或子类型,见下文)的引用来调用它,因此换句话说,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被声明为 a C,它将不起作用。

(更新以添加示例)

于 2011-06-28T22:01:36.343 回答
0

这是this作为IList<T>.
否则你不能T从这个属性返回,因为“plain”的实现会有歧义ILIst

于 2011-06-28T21:59:37.870 回答
0

它显式地实现了接口的索引器。

  • 显式实现导致Interface.XYZ语法
  • 索引器的名称是this,所以它变成Interface.this
于 2011-06-28T22:01:50.897 回答
0

它被称为显式接口实现,它用于解决诸如实现两个碰巧共享一个成员名称的接口之类的问题。基本上,它是一种只能在对象被转换到特定接口时调用的方法。

说:

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.

自然地,如果你已经实现了,它会调用相应的方法,显式实现会覆盖任何隐式实现。

于 2011-06-28T22:06:35.083 回答
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();

对于类FooBar如果调用清理方法可能并不重要,Dispose或者Close对于一个File类,您可能更喜欢Close它而不是Dispose它。其他用途是隐藏您必须实现的接口以参与对象之间的交互,但您不希望对类的消费者可见。或者,您可以使用它来解决使用冲突方法实现多个接口的问题。

您可以在 MSDN 上阅读有关显式接口实现的信息。

于 2011-06-28T22:07:26.120 回答