C# C语言中的接口实现语法选项#

C# C语言中的接口实现语法选项#,c#,.net,generics,syntax,interface,C#,.net,Generics,Syntax,Interface,好的,这是一个非常基本的问题,但我刚刚遇到了。考虑下面的类: public class WindowComparer: IComparer, Generic.IComparer<Window> { } 场景2:MSDN文档通常声明它的方式 int Collections.IComparer.Compare (object x, object y) { // [this.Compare] is not recognized. How to access this? r

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

public class WindowComparer: IComparer, Generic.IComparer<Window> { }
场景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) {...}
int Collections.IComparer.Compare(对象x、对象y)
{
//[this.Compare]未被识别。如何访问它?
返回(这个比较((窗口)x,(窗口)y));
}
int Generic.IComparer.Compare(窗口x,窗口y){…}

但是,在尝试场景2时,intellisense会丢失Compare方法,并且编译器会引发一个错误,指出Compare方法不是WindowComparer的成员。我缺少什么?

在第二个场景中,接口
IComparer
IComparer
是显式实现的,因此只有当您将实例分配给类型为
IComparer
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
        return ((this as IComparer<Window>).Compare((Window)x, (Window)y));
WindowComparer=newwindowcomparer();
IComparer windowComparer=比较器;
//windowComparer上IComparer的调用方法
IComparer normalComparer=比较器;
//在normalComparer上调用IComparer的方法

显式实现接口是为了保持类的公共接口清晰,并隐藏用于比较、相等等的基础结构接口的方法。

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

WindowComparer wcOne = new WindowComparer();
Generic.IComparer<Window> wcTwo = new WindowComparer();
IComparer wcThree = new WindowComparer();
WindowComparer wcOne=新的WindowComparer();
Generic.IComparer wcTwo=新的WindowComparer();
IComparer wcThree=新的WindowComparer();
在本例中,
wcOne
将没有两个
Compare
方法,因为它们是显式实现的
wcTwo
将能够使用来自
Generic的一个。IComparer
wcThree
将能够使用来自
IComparer
的一个返回((作为IComparer)。比较((窗口)x,(窗口)y));
WindowComparer comparer = new WindowComparer();

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

IComparer normalComparer = comparer;
// call methods of IComparer on normalComparer
        return ((this as IComparer<Window>).Compare((Window)x, (Window)y));
要调用
实例,必须将
转换到该接口,如中所示

return ((Generic.IComparer<Window>)this).Compare((Window)x, (Window)y);
返回((Generic.IComparer)this)。比较((窗口)x,(窗口)y);

顺便问一下,你是把你的类放在
系统的
名称空间中,还是你有一个
别名用
来声明名称
通用的

一个只有代码而没有解释的回复可以被复制和粘贴,但是它对未来有类似问题的访问者来说是没有用的。OP问的是“如何”,而不是“为什么”... 这种解决方法对任何“未来有类似问题的访客”仍然有效。从长远来看,知道如何做一些事情是没有用的,除非你知道为什么会这样。谢谢。我不知道接口上的显式声明。除了代码清晰外,它还有什么用途?冲突解决可能吗?@RaheelKhan是的,也可能是您实现了多个接口,这些接口声明了相同的方法签名。因此,在这种情况下,您需要显式实现其中一个方法,因为不可能在一个类上定义具有相同签名的多个方法。通常,您不需要手动调用Compare方法。但是,其他一些数据结构也可以,比如说,在对收集进行排序时。可能是一个很好的起点。感谢@Damien_The_unsiever的链接。如果对象被存储为泛型,并且被限制为一种接口类型,那么它们也可以工作。注意:如果实现接口的值类型作为受接口约束的泛型传递,它将作为值类型;相反,由于接口类型存储位置是引用类型,因此作为接口类型传递的值类型将作为引用类型。这种行为在
List.Enumerator
中最为明显。