好的,这是一个非常基本的问题,但我刚刚碰到它。考虑以下课程:
public class WindowComparer: IComparer, Generic.IComparer<Window> { }
场景1:我通常会声明它的方式。
public int Compare (object x, object y)
{
return (this.Compare((Window) x, (Window) y));
}
public int Compare (Window x, Window y) {...}
场景2:MSDN文档通常声明它的方式。
int Collections.IComparer.Compare (object x, object y)
{
// [this.Compare] is not recognized. How to access this?
return (this.Compare((Window) x, (Window) y));
}
int Generic.IComparer<Window>.Compare (Window x, Window y) {...}
但是,在尝试方案2时,intellisense丢失了Compare方法,并且编译器引发了一个错误,指出Compare方法不是WindowComparer的成员。我错过了什么?
答案 0 :(得分:5)
在第二个场景中,显式实现了接口IComparer
和IComparer<Window>
,因此只有在将实例分配给类型为IComparer<Window>
或{的变量时,才能访问或调用这些方法。 {1}}。
IComparer
明确实现接口以保持类的公共接口清晰,并隐藏基础结构接口的方法以进行比较,相等等。
答案 1 :(得分:1)
使用第二种方法,只有在将对象声明为两个接口之一的实例时,这些方法才有效:
WindowComparer wcOne = new WindowComparer();
Generic.IComparer<Window> wcTwo = new WindowComparer();
IComparer wcThree = new WindowComparer();
在此示例中,wcOne
将没有两个Compare
方法,因为它们是明确实现的。 wcTwo
将能够使用Generic.IComparer<Window>
中的wcThree
,IComparer
将能够使用{{1}}中的{。}}。
答案 2 :(得分:0)
return ((this as IComparer<Window>).Compare((Window)x, (Window)y));
答案 3 :(得分:0)
要调用this
实例上的explicit interface implementation,您必须将this
投射到该界面,如
return ((Generic.IComparer<Window>)this).Compare((Window)x, (Window)y);
顺便说一下,您是否将您的班级置于System
名称空间内,或者您是否有using
别名声明名称Generic
?