关于C#中模糊调用的问题

Pat*_*son 9 .net c# ambiguous-call

我有一个问题,这不是一个真正的问题,但是让我有点好奇的东西.

我有一个有两种方法的课程.一个是静态方法,另一个是实例方法.方法具有相同的名称.

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.
    }
}
Run Code Online (Sandbox Code Playgroud)

当我尝试构建我的项目时,我收到一条错误消息:

以下方法或属性之间的调用不明确:'MyApp.BlockHeader.Peek(System.IO.BinaryReader)'和'MyApp.BlockHeader.Peek(System.IO.BinaryReader)'

我知道方法签名实际上是相同的,但我看不出我怎么可能直接从实例成员调用静态方法.

我认为有一个很好的理由,但有谁知道这是什么原因?

Rub*_*ink 9

C#设计的一般政策是强制您指定存在潜在歧义的地方.面对重构工具,允许人们在一塌糊涂的情况下重新判断事物是否是静态的,这种立场是很好的 - 特别是对于这样的情况.你会看到很多其他的情况(覆盖与虚拟,新的阴影等).

一般来说,删除此类混淆空间会使代码更清晰,并迫使您保持房屋整洁.

编辑:Eric Lippert的一篇好文章讨论了导致你看到错误的这种模糊性的另一个原因

  • 经典示例(在本例中)是一个调用Peek(...)的实例方法; 就是这个.P?还是BlockHeader.Peek? (8认同)