为什么框架通用接口成员不需要将自己声明为新的?

时间:2013-09-10 08:47:56

标签: c# generics interface

我有一个接口,我想根据成员的返回类型创建一个泛型。

因此,如果非通用接口是:

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();
}

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

2 个答案:

答案 0 :(得分:2)

  

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

在IL级别,这两件事是相同的;事实上,无论有没有new,它都会编译到同一个IL - 所以反射器是正确的 new这里唯一的事情 是告诉编译器“我知道我在这里做什么 - 不要添加警告” - 具体来说:

  

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

它不会改变IL输出。如果反射器遇到检查先前声明的麻烦,并且添加new以使其显而易见 - 那将是 nice ,但这只是一个很好的。

答案 1 :(得分:0)

您能否从编译器中提供错误消息?

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