为什么框架泛型接口成员不需要将自己声明为 new
本文关键字:自己 声明 new 不需要 框架 泛型接口 成员 为什么 | 更新日期: 2023-09-27 18:30:49
我有一个接口,我想为它创建一个关于成员返回类型的泛型。
因此,如果非通用接口是:
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();
}
无需新关键字。那么他们的秘密是什么。
由于这似乎"不对",我研究了 MS 如何使用反射器在框架中做到这一点。
在 IL 级别,这两件事是相同的;事实上,它会编译到有和没有new
的同一个 IL - 所以反射器有点正确。 new
在这里唯一要做的就是告诉编译器"我知道我在这里做什么 - 不要添加警告" - 特别是:
警告 {x} 隐藏继承的成员 {y}。如果要隐藏,请使用 new 关键字。
它不会更改 IL 输出。如果反射器不厌其烦地检查先前的声明,并添加new
以使其明显,那就太好了 - 但这只是一个不错的选择。
你能给出编译器的错误消息吗?
我想这只是一个警告,它不会阻止您编译。