gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:44:24 24 4
gpt4 key购买 nike

是否有任何(技术)原因导致 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 { }

最佳答案

假设我定义:

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

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

当一切都明确指定时:

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

关于c# - 为什么我必须指定所有泛型类型参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/516964/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com