为什么VS Metadata视图不显示显式接口实现的成员

Lui*_*ipe 7 c# metadata explicit-interface

前几天我正在查看C#Boolean struct元数据.

Boolean实现了IConvertible接口.但看看布尔的成员,我看不到大多数IConvertible成员.

我和一些同事做了一些测试,包括创建我们自己的类,并得出结论,IConvertible必须明确地为Boolean实现.

问题是,为什么它们不可见?我理解它可能是一个"按设计决定"但我明白如果检查元数据的任何人都可以看到它会增加更多的价值.

测试在VS2010 .NET4.0中完成

Rui*_*iro 6

原因是这些方法只是为了实现I接口而不是为了扩充类的公共接口.

我的意思是,如果您有以下内容:

public class MyClass : IConvertible
{
 // implementation
}
Run Code Online (Sandbox Code Playgroud)

实际上,您可能希望MyClass可以转换,因此您可以将它的引用传递给期望IConvertible的方法:

public void DoSomethingWithConvertible(IConvertible conv)
Run Code Online (Sandbox Code Playgroud)

但您可能不希望MyClass类型的变量公开Convert方法.您根本不希望MyClass的公共接口拥有该方法,然后您明确地实现该接口.这就是这种方法的全部概念.这意味着不允许以下内容:

MyClass a = new MyClass();
a.Convert();
Run Code Online (Sandbox Code Playgroud)

但是,仍然允许以下内容:

MyClass a = new MyClass();
((IConvertible)a).Convert();
Run Code Online (Sandbox Code Playgroud)

这背后的整个想法是,即使我们使用完全相同的实例,因为MyClass没有这个方法.A IConvertible确实有这种方法.可以把它想象成你允许实例具有分裂的个性.

通常我会隐式地实现每个接口.但是,在非常具体的情况下,我会明确地实现它们,原因如上所述.

顺便说一句,谢谢你的好问题!