关于c#:在实现类的方法名称之前包含接口引用的任何原因?

any reason why an interface reference would be included before a method name on an implementing class?

本问题已经有最佳答案,请猛点这里访问。

在实现类的方法名之前包含接口引用有什么原因吗?例如,假设您有一个reportService:IReportService和一个getReport(int reportID)方法。我查看了一些代码,另一个开发人员在ReportService中实现了如下方法:

1
2
3
4
Report IReportService.GetReport(int reportId)
{
  //implementation
}

我以前从未见过这样的服务实现。它有什么作用吗?


这被称为"显式接口实现"。例如,这样做的原因可能是命名冲突。

考虑接口IEnumerableIEnumerable。一个声明了非泛型方法

1
IEnumerator GetEnumerator();

另一个是普通的:

1
IEnumerator<T> GetEnumerator();

在C中,不允许有两个同名的方法,但它们的返回类型不同。因此,如果实现这两个接口,则需要显式声明一个方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
public class MyEnumerable<T> : IEnumerable, IEnumerable<T>
{
    public IEnumerator<T> GetEnumerator()
    {
        ... // return an enumerator
    }

    // Note: no access modifiers allowed for explicit declaration
    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator(); // call the generic method
    }
}

不能对实例变量调用显式实现的接口方法:

1
2
MyEnumerable<int> test = new MyEnumerable<int>();
var enumerator = test.GetEnumerator(); // will always call the generic method.

如果要调用非泛型方法,则需要将test强制转换为IEnumerable

1
((IEnumerable)test).GetEnumerator(); // calls the non-generic method

这似乎也是不允许在显式实现中使用访问修饰符(如publicprivate的原因:它在类型上无论如何都不可见。