7

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

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

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

问题是,为什么它们不可见?我知道这可能是一个“设计决定”,但我知道如果检查元数据的任何人都可以看到它们,它将增加更大的价值。

测试在 VS2010 .NET4.0 中完成

4

4 回答 4

6

原因是这些方法只是为了实现 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();

这背后的整个想法是,即使我们使用完全相同的实例, a as MyClass 也没有该方法。A as IConvertible 确实有这个方法。把它想象成你允许实例有人格分裂。

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

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

于 2011-09-01T10:06:48.147 回答
2

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

于 2011-09-01T09:55:12.500 回答
2

元数据确实显示了明确实现的. 你的意思是智能感知而不是元数据?

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

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

尝试使用提供元数据读取访问权限的工具检查该类。ILDASM 之一,您确实可以找到显式实现方法的元数据。

于 2011-09-01T10:00:55.507 回答
-1

它们是明确实施的。您可以在此处找到所有已实现的可转换:http: //msdn.microsoft.com/en-us/library/system.boolean.aspx

于 2011-09-01T09:49:13.267 回答