0

我有一个接口,我想为它创建一个关于成员返回类型的泛型。

所以如果非泛型接口是:

interface IViewHolder{
  IView View {get;}
}

而且我要

interface IViewHolder<TView> : IViewHolder {
 where TView : class, IView
  TView View {get;}
}

这样我就可以在IViewHolder<T>任何需要 IViewHolder 的地方使用,我必须在泛型中为 View 成员使用 new 关键字,否则它不会编译。

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

所以IEnumerable<T>他们这样做:

[TypeDependency("System.SZArrayHelper"), __DynamicallyInvokable]
public interface IEnumerable<out T> : IEnumerable
{
    [__DynamicallyInvokable]
    IEnumerator<T> GetEnumerator();
}

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

4

2 回答 2

2

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

在 IL 级别,这两件事是相同的。事实上,无论有没有-sonew反射器,它都会编译成相同的 IL 。这里唯一要做的就是告诉编译器“我知道我在这里做什么——不要添加警告”——特别是:new

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

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

于 2013-09-10T08:53:34.230 回答
0

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

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

于 2013-09-10T08:53:42.143 回答