我有一个接口,我想根据成员的返回类型创建一个泛型。
因此,如果非通用接口是:
interface IViewHolder{
IView View {get;}
}
我想要
interface IViewHolder<TView> : IViewHolder {
where TView : class, IView
TView View {get;}
}
这样我可以在需要IViewHolder时使用IViewHolder<T>
,我必须在泛型中使用View关键字的new关键字,否则它不会编译。
由于这似乎“不对”,我研究了MS如何在框架中使用反射器。
因此对IEnumerable<T>
他们来说:
[TypeDependency("System.SZArrayHelper"), __DynamicallyInvokable]
public interface IEnumerable<out T> : IEnumerable
{
[__DynamicallyInvokable]
IEnumerator<T> GetEnumerator();
}
无需新关键字。那么他们的秘密是什么。
答案 0 :(得分:2)
由于这似乎“不对”,我研究了MS如何在框架中使用反射器。
在IL级别,这两件事是相同的;事实上,无论有没有new
,它都会编译到同一个IL - 所以反射器是正确的。 new
这里唯一的事情 是告诉编译器“我知道我在这里做什么 - 不要添加警告” - 具体来说:
警告{x}隐藏继承的成员{y}。如果想要隐藏,请使用new关键字。
它不会改变IL输出。如果反射器遇到检查先前声明的麻烦,并且添加new
以使其显而易见 - 那将是 nice ,但这只是一个很好的。
答案 1 :(得分:0)
您能否从编译器中提供错误消息?
我想这只是一个警告,它不会阻止你编译。