C# 为什么我必须指定所有泛型类型参数?
C#是否有任何(技术)原因要求所有泛型类型参数都用其封闭类的名称声明 例如,我想声明:C# 为什么我必须指定所有泛型类型参数?,c#,generics,C#,Generics,C#是否有任何(技术)原因要求所有泛型类型参数都用其封闭类的名称声明 例如,我想声明: public class FruitCollection<TFruit> : FoodCollection<TFoodGroup> where TFruit : IFood<TFoodGroup> where TFoodGroup : IFoodGroup { } public class AppleCollection : FruitCollection
public class FruitCollection<TFruit> : FoodCollection<TFoodGroup>
where TFruit : IFood<TFoodGroup>
where TFoodGroup : IFoodGroup { }
public class AppleCollection : FruitCollection<Apple> { }
public class TomatoCollection : FruitCollection<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 { }
公共接口IFoodGroup{}
公共类水果组:IFoodGroup{}
公共类VegetableGroup:IFoodGroup{}
公共接口IFood,其中TFoodGroup:IFoodGroup{}
公共类苹果:IFood{}
公共类番茄:IFood{}
公共抽象类FoodCollection,其中TFoodGroup:IFoodGroup{}
假设我定义:
public class Wompom : IFood<VegetableGroup>, IFood<FruitGroup>
{
}
public class Wompom:IFood,IFood
{
}
foultcollection
是什么意思
当所有内容都明确指定时:
- 编译器不必执行如此复杂的推理
- 这种语言不必执行那么多复杂的规则
- 你不能陷入那么多奇怪的、不可能的情况
public class Wompom : IFood<VegetableGroup>, IFood<FruitGroup>
{
}