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类上定义的,它是框架所有类的最终基类。

此方法用于在运行时获取当前实例的类型,我认为您不打算覆盖它(您有一个 int 返回类型)。

我建议您将方法重命名为 GetFooType 或其他名称,或显式实现您的接口以避免运行时问题。

于 2009-07-20T05:45:08.710 回答
4

它指的是您的方法隐藏GetType在对象中,而不是从您的界面中。由于您的类继承了 object 和 implements IFoo,并且都提供了一个GetType方法,因此通过隐式实现接口,您将隐藏GetType从对象继承的内容。如果您仍然希望调用您的接口方法,则可以在以下位置显式GetType实现它:Foo

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 中定义的方法的警告的原因。您不会收到 GetDisplayName 的此警告,因为 System.Object(或就此而言任何父类)未定义此方法。

我建议您将方法名称更改为其他名称,因为 .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 回答