使用点表示法实现C#方法

14

阅读一篇文章时,我遇到了以下C#语法方法名称。

private class sortYearAscendingHelper : IComparer
{
   int IComparer.Compare(object a, object b)
   {
       ...
   }
}
我理解Compare方法是IComparer接口的一部分,但作为来自C++的人,我不确定这个语法是什么意思。如果Compare是接口的一部分,我希望只需要像int Compare(...)这样提到就可以了。为什么我们还要指定类呢?

我了解Compare方法是IComparer接口的一部分,但作为一个来自C++的人,我不确定这个语法的含义。如果Compare是接口的一部分,我期望只需声明为int Compare(...)。为什么我们还要指定类呢?


3
这被称为显式接口实现,在这种情况下并不是必需的。你可以使用显式接口实现来区分隐式类型/类接口和显式实现的接口中属于哪个方法。 - User 12345678
4
正如 @TimCoker 所指出的那样,这个问题是关于“这种记号是什么”而不是“什么是显式实现”,因此可能应该重新打开。 - dee-see
@Vache,另一篇帖子已经回答了这个问题,这是关闭它作为重复的合适理由。这个问题不知道该如何称呼它,因此没有找到重复的问题,这并不意味着这些问题不是重复的。 - Servy
由于链接评论已经不存在,因此这个问题应该重新关闭为重复的:https://dev59.com/PnVC5IYBdhLWcg3w7V1q - Servy
1个回答

17

这是一种明确的接口实现方式。当您从包含相似函数(相同签名)但需要每个接口的不同实现的多个接口派生时,可以使用它。

更多信息请参见MSDN

(来自链接页面的示例):

如果两个接口成员执行的功能不同,这可能会导致一个或两个接口的实现不正确。可以明确地实现接口成员-创建一个仅通过接口调用且特定于该接口的类成员。这是通过使用接口名称和句点命名类成员来实现的。例如:

public class SampleClass : IControl, ISurface
{
    void IControl.Paint()
    {
        System.Console.WriteLine("IControl.Paint");
    }
    void ISurface.Paint()
    {
        System.Console.WriteLine("ISurface.Paint");
    }
}

类成员IControl.Paint只能通过IControl接口访问,而ISurface.Paint只能通过ISurface接口访问。两个方法的实现是分开的,且都不能直接在类上使用。


这是一个很好的回答,但是重点是什么?这个问题是重复的。 - User 12345678
1
@ByteBlast 当我回答时,我不知道它是一个重复的问题。鉴于这个问题是关于语法的(并非明确涉及隐式与显式实现),我不确定我同意它一个重复的问题。 - BradleyDotNET
请注意,我并不是有意冒犯,我只是想理解这些情境下答案背后的思维方式,因为它们总是让我一脸懵逼。 - User 12345678
@ByteBlast 没有冒犯:)。 - BradleyDotNET

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接