2009-02-05 75 views
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> { } 

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

回答

6

假设我定义:

public class Wompom : IFood<VegetableGroup>, IFood<FruitGroup> 
{ 
} 

什么会FruitCollection<Wompom>是什么意思?

当没有明确规定的一切:

  • 编译器不具有执行尽可能多的复杂推理
  • 的语言没有执行许多复杂的规则
  • 你不能进入尽可能多的奇怪,不可能的情况
相关问题