我收到以下编译器警告:
'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并搜索了这个错误,它似乎适用于类继承,而不是接口。我真的很困惑为什么会为接口触发它(它将其方法定义为虚拟)。
提前感谢您的见解。
答案 0 :(得分:10)
GetType方法是在System.Object类上定义的,它是Framework的所有类的最终基类。
此方法用于在运行时获取当前实例的Type,我认为您不打算覆盖它(您有一个int返回类型)。
我建议您将方法重命名为GetFooType或其他内容,或者实现您的接口explicitly以避免运行时问题。
答案 1 :(得分:4)
它指的是您的方法隐藏GetType
来自对象,而不是来自您的界面。由于您的类继承了对象并实现了IFoo
,并且都提供了GetType
方法,通过隐式实现接口,您将隐藏从对象继承的GetType
。如果您仍希望调用接口方法GetType
,则可以在Foo
中明确实现 :
int IFoo.GetType()
{
return 3;
}
答案 2 :(得分:3)
.NET中的所有类型都派生自System.Object。
System.Object已经定义了一个名为GetType的方法。如果在类中定义另一个方法“GetType”,并且有人创建了类的对象,则它们永远不能调用System.Object提供的GetType方法。这就是您收到“GetType”隐藏System.Object中定义的方法的警告的原因。您没有收到GetDisplayName的此警告,因为System.Object(或任何父类)没有定义此方法。
我建议您将方法名称更改为其他名称,因为.NET开发人员通常希望GetType方法调用以引用System.Object实现。
答案 3 :(得分:2)
它不是抱怨你的接口实现,而是你已经在“对象”上的GetType()的重新实现--Foo自动继承。 “对象”没有GetDisplayName方法,因此不会引起任何抱怨。如果你真的想要隐藏object.GetType(),请尝试重命名方法或添加“new”修饰符,但不推荐使用。
答案 4 :(得分:-1)
System.Object类已经有GetType()方法
您应该使用new或override关键字来解决此问题