3
是否有任何(技术)的原因,C#要求所有的泛型类型参数声明与他们的封闭类的名称?为什么我必须指定所有的泛型类型参数?
例如,我想声明这个:
public class FruitCollection<TFruit> : FoodCollection<TFoodGroup>
where TFruit : IFood<TFoodGroup>
where TFoodGroup : IFoodGroup { }
public class AppleCollection : FruitCollection<Apple> { }
public class TomatoCollection : FruitCollection<Tomato> { }
TFruit
是IFood<TFoodGroup>
,所以TFoodGroup
必须如已设置TFruit
定义,尽管我还没有明确宣布它。
相反,我必须这样做:
public class FruitCollection<TFoodGroup, TFruit> : FoodCollection<TFoodGroup>
where TFruit : IFood<TFoodGroup>
where TFoodGroup : IFoodGroup { }
// Anything other than FruitGroup is an error when combined with Apple
public class AppleCollection : FruitCollection<FruitGroup, Apple> { }
// Anything other than VegetableGroup is an error when combined with Tomato
public class TomatoCollection : FruitCollection<VegetableGroup, Tomato> { }
第二种方法工作得很好,并防止任何无效组合进行编译,但它开始为越来越多的不必要的泛型类型声明添加到参数越来越凌乱名单。
在组中的其他定义是:
public interface IFoodGroup { }
public class FruitGroup : IFoodGroup { }
public class VegetableGroup : IFoodGroup { }
public interface IFood<TFoodGroup> where TFoodGroup : IFoodGroup { }
public class Apple : IFood<FruitGroup> { }
public class Tomato : IFood<VegetableGroup> { }
public abstract class FoodCollection<TFoodGroup> where TFoodGroup : IFoodGroup { }