1

次のコンパイラ警告が表示されます。

'Resources.Foo.GetType()' hides inherited member 'object.GetType()'. Use the new keyword if hiding was intended.    Resources.NET\Resources\Class1.cs   123 20  Resources

この(非常に単純化された)コードの場合:

public interface IFoo
{
    int GetType();
    string GetDisplayName();
}

public class Foo : IFoo
{
    public int GetType() { return 3; }   *** Warning: points to here (line 123)***
    public string GetDisplayName() { return "Foo"; }
}

私が得られないのは、なぜ GetDisplayName() 関数が警告を受けないのかということです。私は明らかに何かを見落としています。

Stack Overflow を調べてこのエラーをググったところ、インターフェイスではなく、クラスの継承に適用されるようです。なぜこれがインターフェイスに対してトリガーされるのか(メソッドを仮想として定義する)、私は本当に混乱しています。

洞察力を前もって感謝します。

4

5 に答える 5

10

GetTypeメソッドは、フレームワークのすべてのクラスの最終的な基本クラスであるSystem.Objectクラスで定義されます。

このメソッドは、実行時に現在のインスタンスのTypeを取得するために使用されます。オーバーライドするつもりはないと思います (int 戻り値の型があります)。

メソッドの名前を GetFooType などに変更するか、インターフェイスを明示的に実装して実行時の問題を回避することをお勧めします。

于 2009-07-20T05:45:08.710 に答える
4

GetTypeインターフェイスからではなく、オブジェクトから隠れているメソッドを指します。あなたのクラスは object と implements を継承し、両方ともメソッドをIFoo提供するため、インターフェイスを暗黙的に実装することで、継承された from オブジェクトを非表示にします。それでもインターフェイス メソッドを呼び出す必要がある場合は、代わりに明示的に実装できます。GetTypeGetTypeGetTypeFoo

int IFoo.GetType()
{
    return 3;
}
于 2009-07-20T05:45:43.467 に答える
3

.NET のすべての型は System.Object から派生します。

System.Object は、GetType という名前のメソッドを既に定義しています。クラスで別のメソッド 'GetType' を定義し、誰かがそのクラスのオブジェクトを作成した場合、System.Object によって使用可能になった GetType メソッドを呼び出すことはできません。これが、'GetType' が System.Object で定義されたメソッドを非表示にするという警告を受け取る理由です。System.Object (またはその親クラス) がこのメソッドを定義していないため、GetDisplayName に対してこの警告は表示されません。

一般に、.NET 開発者は GetType メソッド呼び出しが System.Object 実装を参照することを期待しているため、メソッド名を別の名前に変更することをお勧めします。

于 2009-07-20T05:45:42.280 に答える
2

インターフェイスの実装について不平を言うのではなく、すでに「オブジェクト」にある GetType() の再実装 - そこから Foo が自動的に継承されます。「オブジェクト」には GetDisplayName メソッドがないため、それに対する苦情は発生しません。object.GetType() を本当に隠したい場合は、メソッドの名前を変更するか、"new" 修飾子を追加してみてください。ただし、推奨されません。

于 2009-07-20T05:45:36.743 に答える
-1

System.Object クラスには既に GetType() メソッドがあります

この問題を解決するには、 new または override キーワードを使用する必要があります

于 2009-07-20T05:48:46.783 に答える