为什么框架泛型接口成员不需要将自己声明为 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();
}

无需新关键字。那么他们的秘密是什么。

为什么框架泛型接口成员不需要将自己声明为 new

由于这似乎"不对",我研究了 MS 如何使用反射器在框架中做到这一点。

在 IL 级别,这两件事是相同的;事实上,它会编译到有和没有new的同一个 IL - 所以反射器有点正确 new在这里唯一要做的就是告诉编译器"我知道我在这里做什么 - 不要添加警告" - 特别是:

警告 {x} 隐藏继承的成员 {y}。如果要隐藏,请使用 new 关键字。

它不会更改 IL 输出。如果反射器不厌其烦地检查先前的声明,并添加new以使其明显,那就太好了 - 但这只是一个不错的选择。

你能给出编译器的错误消息吗?

我想这只是一个警告,它不会阻止您编译。