2

好的,这是一个非常基本的问题,但我只是遇到了它。考虑以下类:

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 的成员。我错过了什么?

4

4 回答 4

5

在第二个场景中,接口是显IComparerIComparer<Window>实现的,因此只有当您将实例分配给类型为IComparer<Window>or的变量时,这些方法才可访问或可调用IComparer

WindowComparer comparer = new WindowComparer();

IComparer<Window> windowComparer = comparer;
// call methods of IComparer<Window> on windowComparer

IComparer normalComparer = comparer;
// call methods of IComparer on normalComparer

这些接口被显式实现以保持类的公共接口清晰,并隐藏用于比较、相等等的基础设施接口的方法。

于 2013-06-11T07:24:58.950 回答
1

使用第二种方法,这些方法仅在您将对象声明为两个接口之一的实例时才有效:

WindowComparer wcOne = new WindowComparer();
Generic.IComparer<Window> wcTwo = new WindowComparer();
IComparer wcThree = new WindowComparer();

在此示例中,wcOne将没有这两种Compare方法,因为它们是显式实现的。wcTwo将能够使用一个 fromGeneric.IComparer<Window>并且wcThree将能够使用一个 from IComparer

于 2013-06-11T07:25:07.640 回答
0
        return ((this as IComparer<Window>).Compare((Window)x, (Window)y));
于 2013-06-11T07:27:10.223 回答
0

要在实例上调用显式接口实现this,您必须强制转换this为该接口,如

return ((Generic.IComparer<Window>)this).Compare((Window)x, (Window)y);

顺便说一句,你是把你的类放在System命名空间中,还是有一个using别名来声明名称Generic

于 2013-06-11T08:15:01.113 回答