【发布时间】:2010-10-27 14:05:32
【问题描述】:
我有一个问题,但不是什么大问题,但让我有点好奇。
我有一个类,里面有两个方法。一种是静态方法,另一种是实例方法。这些方法具有相同的名称。
public class BlockHeader
{
public static BlockHeader Peek(BinaryReader reader)
{
// Create a block header and peek at it.
BlockHeader blockHeader = new BlockHeader();
blockHeader.Peek(reader);
return blockHeader;
}
public virtual void Peek(BinaryReader reader)
{
// Do magic.
}
}
当我尝试构建我的项目时,我收到一条错误消息:
调用之间有歧义 以下方法或属性: 'MyApp.BlockHeader.Peek(System.IO.BinaryReader)' 和 'MyApp.BlockHeader.Peek(System.IO.BinaryReader)'
我知道方法签名实际上是相同的,但我看不出我怎么可能直接从实例成员调用静态方法。
我认为这有一个很好的理由,但有人知道这是什么原因吗?
【问题讨论】:
-
我认为这是因为 J# 和其他语言确实允许您从实例成员调用静态方法。 CLR 必须强制执行最低公分母。
-
我也觉得这很奇怪。规范非常清楚这种行为是正确的。请参阅第 7.5.5.1 节,内容如下:“如果最好的方法是静态方法,则方法组必须来自简单名称或通过类型的成员访问......”注意该位是如何发生的 AFTER我们找出“最佳”方法的地方。在检查静态性之前,首先明确计算“最佳”。因此,最佳性不考虑静态性,在您的情况下,无法确定最佳方法。因此,歧义错误。
-
不管怎样,你问的原因。这种看似奇怪的行为的原因是为了解决我们所说的“颜色问题”。当您有“Color Color = Color.Red; Color.Foo();”时,这是否意味着“在 Color 类型上调用静态方法 Foo”,还是意味着“在本地 Color 上调用实例方法 Foo”?编译器允许两者,因此在解析 Foo 之前无法确定“Color.Foo()”中“Color”的含义。这意味着必须在我们确切知道“颜色”的含义之前解决 Foo 问题。在您的情况下,无法明确解决。
-
有关颜色颜色问题的更多信息,请参见第 7.5.4.1 节。
-
Eric Lippert:您应该将您写的内容复制到答案中,以便我可以将其设置为接受的答案。
标签: c# .net ambiguous-call