1

オブジェクトの参照をメソッドに渡すことについて学習しようとしているときに、メソッドヘッドの静的オブジェクトを削除しようとすると、エラーが発生します。エラーメッセージには次のように表示されます。非静的フィールド、メソッド、またはプロパティにはオブジェクト参照が必要です......しかし、パラメータに参照はすでにありませんか?静的を使用しないコードを見たことがありますが、なぜこれが機能しないのですか?オブジェクトではないクラスからメソッドが使用される場合、staticが使用されることを私は知っています。理解していただければ幸いです。ありがとう!

    // Method
    internal static string ChangeName(Box obj)
    {
        return obj.BoxName;
    }

編集:コード全体を追加しました。静的なメインメソッドの内部から呼び出している問題はありますか?

class Program
{
    static void Main(string[] args)
    {

        Box box1, box2;
        box1 = new Box("Nick","R90",1);
        box2 = new Box("Hanna","B27",2);

        Console.WriteLine(ChangeName(box2));
        Console.Read();

    }

    // Methods
    private static string ChangeName(Box obj)
    {
        return obj.BoxName;
    }
}
4

2 に答える 2

9

静的メソッドは次のように呼び出されます。

MyClass.Method(arg);

インスタンスメソッドは次のように呼び出されます。

MyClass myInstance = new MyClass();
myInstance.Method(arg);

2つは互換性がありません。

メソッドのシグネチャを変更する場合は、メソッドが呼び出されるすべての場所も変更する必要があります。

編集:あなたは修飾されていない呼び出しを使用しています。修飾されていない呼び出しを使用するためのルールは次のとおりです。

  • 静的メソッドは静的メソッドを呼び出すことができます。
  • 静的メソッドはインスタンスメソッドを呼び出すことはできません。(これはあなたの問題です。)
  • インスタンスメソッドは静的メソッドを呼び出すことができます。
  • インスタンスメソッドは、インスタンスメソッドを呼び出すことができます。

このメソッドは、実際にはBoxクラスのインスタンスメソッドとして実装する必要があります。次に、次のように言います。

Console.WriteLine(box2.ChangeName());

Boxコードにアクセスできない場合は、拡張メソッドを作成するか、例のようにメソッドを静的に保つことができます。

于 2012-04-26T19:54:14.220 に答える
2

おそらくエラーは、このメソッドを呼び出している場所です。静的メソッドから呼び出す場合は、オブジェクトインスタンスに対して明示的に呼び出すか、静的メソッドを呼び出す必要があります。

于 2012-04-26T19:55:33.897 に答える