我想了解约束(类或泛型方法)如何影响方法本身。拿这个代码,例如:重写通用方法的约束
class Base<T> where T:class, IComparable<T>
{
public virtual void Method(T obj) { }
}
class Derived<T> : Base<T> where T:class, IComparable<T>, IEnumerable<T>
{
public override void Method(T obj) { }
}
此代码编译罚款和编译器/运行时能够解析到非泛型方法“方法”这需要一个参数,它是通用型的多态调用。在基类和派生类中,类型参数的约束是不同的。
我还指定一个类约束以保持超时值类型,因为为每个值型实例中产生一个不同的类,而只有一个这样的类被实例化引用类型可能可能引起问题。
另一方面,下面的代码不能编译。
class Base
{
public virtual void Method<T>() where T : class, IComparable<T> { }
}
class Derived : Base
{
public override void Method<T>() where T : class, IComparable<T>, IEnumerable<T> { }
}
为C#语言规范指出在通用方法中的约束结转,因为它是一个压倒一切的方法,它是非法的指定任何约束作为这样。我在Google上进行了一些搜索,结果发现由于支持多态调用(关于维护方法表等)的复杂性,这是不允许的。但我仍然不明白为什么它在上面的情况1中起作用,这与此类似,只不过它是通用类。如果编译器/运行时能够在情况1中做到这一点,而情况2被标记为编译器错误?
案例1你有基类和dervied两个泛型 –
@EhsanSajjad - 所以?在第一种情况下,它是通用类,而在第二种情况下,它是方法。没有指定一个'类约束'限制实例化只有一个?那么为什么一个人不允许,而其他人正常工作? – Madhusudhan