Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我必须指定所有泛型类型参数?_C#_Generics - Fatal编程技术网

C# 为什么我必须指定所有泛型类型参数?

C# 为什么我必须指定所有泛型类型参数?,c#,generics,C#,Generics,C#是否有任何(技术)原因要求所有泛型类型参数都用其封闭类的名称声明 例如,我想声明: public class FruitCollection<TFruit> : FoodCollection<TFoodGroup> where TFruit : IFood<TFoodGroup> where TFoodGroup : IFoodGroup { } public class AppleCollection : FruitCollection

C#是否有任何(技术)原因要求所有泛型类型参数都用其封闭类的名称声明

例如,我想声明:

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>
{
}