这个问题源于我昨天问过的问题:Interface Base class instantiation via generic method
为了完整起见,我将重复使用我在该问题中使用的示例。
如果我有这样的界面:
interface IFoo<TEnum> where TEnum : struct, IConvertible, IComparable, IFormattable
{
TEnum MyEnum { get; set; }
}
我也有一个基类,如下:
abstract class FooBase<TEnum> : IFoo<TEnum> where TEnum : struct, IConvertible, IFormattable, IComparable
{
public TEnum MyEnum { get; set; }
}
然后我从基类继承,如下:
class MyFoo : FooBase<MyFoo.MyFooEnum>
{
public enum MyFooEnum
{
Foo1,
Foo2,
}
}
然后我有一个通用的方法,必须看起来像这样:
static class FooMethods
{
public static TFooClass GetFoo<TFooClass, TEnum>()
where TFooClass : FooBase<TEnum>, new()
where TEnum : struct, IComparable, IConvertible, IFormattable //why is this necessary?
{
TFooClass fooclass = new TFooClass();
return fooclass;
}
}
我的问题是为什么我需要指定我的基类将采用什么类型,基类何时指定它自己?如果我的派生类继承自基类,那么编译器应该能够纯粹通过查看基类需要什么来推断基类的类型参数约束?