9

特に問題ではないのですが、少し気になった質問があります。

2 つのメソッドを持つクラスがあります。1 つは静的メソッドで、もう 1 つはインスタンス メソッドです。メソッドは同じ名前です。

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)' のメソッドまたはプロパティ間の呼び出しがあいまいです。

メソッドのシグネチャが実質的に同じであることはわかっていますが、インスタンス メンバーから静的メソッドを直接呼び出す方法がわかりません。

これにはかなりの理由があると思いますが、その理由を知っている人はいますか?

4

3 に答える 3

9

C# 設計の一般的なポリシーは、潜在的なあいまいさがある場合は必ず指定することです。物事が静的であるかどうかに関係なく、帽子をかぶってリジングできるリファクタリング ツールに直面して、このスタンスは素晴らしいです。特にこのような場合はそうです。このような他の多くのケースが表示されます (オーバーライドと仮想、シャドーイングの新規など)。

一般に、この種の混乱の余地をなくすと、コードがより明確になり、家を整理整頓しなければならなくなります。

編集: Eric Lippert からの良い投稿では、このあいまいさがあなたが見たエラーにつながる別の理由について説明しています

于 2009-05-20T09:36:14.790 に答える
4

C# 3.0 言語仕様からの抜粋を次に示します。

メソッドのシグネチャは、メソッドが宣言されているクラス内で一意である必要があります。メソッドのシグネチャは、メソッドの名前、型パラメーターの数、およびそのパラメーターの数、修飾子、および型で構成されます。メソッドのシグネチャには、戻り値の型は含まれません。

「静的」修飾子は署名の一部ではないため、この例は一意の署名の規則に違反しています。

ただし、ルールの背後にある理由はわかりません。

于 2009-05-20T10:08:00.497 に答える
2

それを禁止する技術的な理由はないと思いますが、プログラマーを自分自身から保護するためにそうされています。次の例を考えてみましょう。

public static void Main()
{
  BlockHeader BlockHeader = new BlockHeader();
  BlockHeader.Peek();
}

上記の例は完全に有効ですが、あなたが説明する状況が許可された場合、それは読みやすくなりますか?インスタンスメソッドと静的メソッドのどちらが呼び出されたかが一瞬でわかりますか?

于 2009-05-20T09:47:39.993 に答える