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

本文关键字:显式接口实现 成员 显示 VS 元数据 视图 为什么 | 更新日期: 2023-09-27 18:07:17

前几天我在看c#布尔结构元数据

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

我已经和一些同事做了一些测试,包括创建我们自己的类,并得出结论,IConvertible必须为Boolean显式实现。

问题是,为什么它们不可见?我明白这可能是一个"设计决定",但我明白如果它们对任何检查元数据的人都是可见的,它将增加更大的价值。

测试是在VS2010 .NET4.0中完成的

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

原因是这些方法的存在只是为了实现i接口,而不是为了增加类的公共接口。

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

public class MyClass : IConvertible
{
 // implementation
}

你可能希望MyClass是可转换的,这样你就可以把它的引用传递给期望它是不可转换的方法:

public void DoSomethingWithConvertible(IConvertible conv)

但是您可能不希望MyClass类型的变量公开Convert方法。您只是不希望MyClass的公共接口具有该方法,然后显式地实现该接口。这就是这个方法的全部思想。这意味着以下内容是不允许的:

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

但是,以下仍然是允许的:

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

这背后的整个想法是,即使我们使用完全相同的实例,一个作为MyClass没有方法。可逆的A有这个方法。就好像你允许这个实例有人格分裂。

通常我隐式地实现每个接口。然而,在一些非常特殊的情况下,由于上述原因,我需要明确地实现它们。

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

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

元数据确实显示了显式实现。你指的是智能感知而不是元数据吗?

我想说这是通过设计和帮助布尔的开发人员将接口限制为一个子集。通过限制建议使用的内容,也可以看到被认为是异常使用的内容。例如,通常不建议将布尔值视为特定的数值,但在某些情况下,无论如何都可以方便地这样做。

IDictinary<T,K>。它实现了IEnumerable<KeyValuePair<T,K>>,使得可以遍历集合中的所有对和ICollation<KeyValuePair<T,K>>。所以你可以在给定KeyValuePair的字典上调用Add但通常你应该使用Add(K, key, T Value)

尝试使用提供对元数据读访问的工具检查类。例如ILDASM,您确实可以找到显式实现方法的元数据。

它们是显式实现的。您可以在这里找到所有实现的可转换文件:http://msdn.microsoft.com/en-us/library/system.boolean.aspx