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

时间:2011-09-01 09:47:13

标签: c# metadata explicit-interface

前几天我正在查看C#Boolean struct metadata。

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

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

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

测试在VS2010 .NET4.0中完成

4 个答案:

答案 0 :(得分:5)

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

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

public class MyClass : IConvertible
{
 // implementation
}

你可能希望MyClass可以转换,所以你可以将它的引用传递给期望IConvertible的方法:

public void DoSomethingWithConvertible(IConvertible conv)

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

MyClass a = new MyClass();
a.Convert();

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

MyClass a = new MyClass();
((IConvertible)a).Convert();

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

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

顺便说一下,谢谢你这个好问题!

答案 1 :(得分:2)

因为显式接口实现实际上隐藏了实现。

答案 2 :(得分:2)

元数据确实显示explicitly implemented。你的意思是intellisense而不是元数据吗?

我说这是设计并帮助开发人员说布尔限制接口到一个子集。通过限制建议使用它,它也变得可见,它被认为是异常使用。例如。通常不建议将布尔值视为特定的数值,但在某些情况下,无论如何都能够做到这一点很方便。

IDictinary<T,K>是另一个例子。它实现了IEnumerable<KeyValuePair<T,K>>,可以迭代集合中的所有对和ICollation<KeyValuePair<T,K>>。因此,您可以在给定KeyValuePair的字典上调用Add,但通常应使用Add(K, key, T Value)

尝试使用提供元数据读取权限的工具检查类。 ILDASM for one,您确实可以找到明确实现的方法的元数据。

答案 3 :(得分:-1)

他们是explicitly implemented。您可以在此处找到所有已实施的可兑换项:http://msdn.microsoft.com/en-us/library/system.boolean.aspx