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

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>,因此如果提供了TFruit,就必须定义TFoodGroup,即使我没有明确声明。

相反,我必须这样做:

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 { }
1个回答

6
假设我定义了以下内容:
public class Wompom : IFood<VegetableGroup>, IFood<FruitGroup>
{
}

FruitCollection<Wompom> 是什么意思?

当所有东西都被明确指定时:

  • 编译器不需要执行太多复杂的推理
  • 语言不需要执行太多复杂的规则
  • 你不可能遇到那么多奇怪、不可能的情况

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接