前几天我在看 C# Boolean struct metadata。
Boolean 实现了 IConvertible 接口。但是看着布尔的成员,我看不到大多数 IConvertible 成员。
我与一些同事进行了一些测试,包括创建我们自己的类,并得出结论,IConvertible 必须为 Boolean 显式实现。
问题是,为什么它们不可见?我知道这可能是一个“设计决定”,但我知道如果检查元数据的任何人都可以看到它们,它将增加更大的价值。
测试在 VS2010 .NET4.0 中完成
前几天我在看 C# Boolean struct metadata。
Boolean 实现了 IConvertible 接口。但是看着布尔的成员,我看不到大多数 IConvertible 成员。
我与一些同事进行了一些测试,包括创建我们自己的类,并得出结论,IConvertible 必须为 Boolean 显式实现。
问题是,为什么它们不可见?我知道这可能是一个“设计决定”,但我知道如果检查元数据的任何人都可以看到它们,它将增加更大的价值。
测试在 VS2010 .NET4.0 中完成
原因是这些方法只是为了实现 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 确实有这个方法。把它想象成你允许实例有人格分裂。
通常我会隐式地实现每个接口。但是,出于上述原因,在某些非常具体的情况下,我会明确地实现它们。
顺便说一句,谢谢你的好问题!
因为显式接口实现实际上隐藏了实现。
元数据确实显示了明确实现的. 你的意思是智能感知而不是元数据?
我会说这是设计使然,并帮助说 Boolean 的开发人员将接口限制为子集。通过限制建议使用的内容,被认为是异常使用的内容也变得可见。例如,通常不建议将布尔值视为特定的数值,但在某些情况下,无论如何都可以很方便地做到这一点。
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