带有继承和接口的C#泛型where子句

带有继承和接口的C#泛型where子句,c#,C#,我有一个类,我想成为泛型,其中T被限制为任何派生类型的水果。我还希望该类从另一个类派生,并实现一个接口。不幸的是,我无法理解语法。这是我目前为止所做的,但它不起作用: public abstract class Food<T> where T : Fruit, BaseClass, IInterface {} 公共抽象类食物,其中T:Fruit,BaseClass,IInterface{} 这个想法是食品的特殊类只能是从水果派生的对象,比如苹果:水果=>食品,或者橙子:水果=>食

我有一个类,我想成为泛型,其中
T
被限制为任何派生类型的
水果。我还希望该类从另一个类派生,并实现一个接口。不幸的是,我无法理解语法。这是我目前为止所做的,但它不起作用:

public abstract class Food<T> where T : Fruit, BaseClass, IInterface {}
公共抽象类食物,其中T:Fruit,BaseClass,IInterface{}
这个想法是
食品的特殊类
只能是从
水果
派生的对象,比如
苹果:水果=>食品
,或者
橙子:水果=>食品
,我还希望
食品
继承
基类
,并实现
IInterface
的成员

目前这是一个语法错误,我不知道如何正确地写出它。我怎么能做到这一点呢?

它的意思是“食物与食物接触,t只能从水果中降下来”:


你问什么还不完全清楚,但这至少说明:

public class BaseClass {}
public interface IInterface{}

public class Fruit {}
public class Apple : Fruit {}
public class Orange : Fruit {}

public class Food<T> : BaseClass, IInterface where T : Fruit {}
公共类基类{}
公共接口接口{}
公共类水果{}
公营苹果:水果{}
公共级橙:水果{}
公共类食品:基类,接口,其中T:水果{}
A具有以下语法:

class_declaration
    : attributes? class_modifier* 'partial'? 'class' identifier type_parameter_list?
      class_base? type_parameter_constraints_clause* class_body ';'?
    ;
class_base
    : ':' class_type
    | ':' interface_type_list
    | ':' class_type ',' interface_type_list
    ;

interface_type_list
    : interface_type (',' interface_type)*
    ;
type_parameter_constraints_clause
    : 'where' type_parameter ':' type_parameter_constraints
    ;
由于您希望
食品
实现
接口
并从
基类
继承,因此它们是
基类
规范的一部分,而不是后面的
类型参数约束条款
(带有
where
一词的部分)

从语法中,您可以看到
class_base
将位于单词
之前,其中

public abstract class Food<T>: BaseClass, IInterface where T : Fruit {}
公共抽象类Food:BaseClass,接口,其中T:Fruit{}

“因此,想法是,
食品的派生类”
“我认为您误解了泛型约束的含义
T:水果
约束
T,而非食品的衍生类别。你不能控制食物的子类做什么。你的意思是说食物应该继承水果,而食物应该继承基类,实现接口吗?也许我说错了,但基本上,如果我创建一个新的
食品
,它只会接受
水果
的类型,比如
新食品()
新食品()我明白了,那么
基类
接口
呢?基类只是一个基类,食物从基类继承而来,我需要一个接口为以后的库存系统提供多态性。
class_declaration
    : attributes? class_modifier* 'partial'? 'class' identifier type_parameter_list?
      class_base? type_parameter_constraints_clause* class_body ';'?
    ;
class_base
    : ':' class_type
    | ':' interface_type_list
    | ':' class_type ',' interface_type_list
    ;

interface_type_list
    : interface_type (',' interface_type)*
    ;
type_parameter_constraints_clause
    : 'where' type_parameter ':' type_parameter_constraints
    ;
public abstract class Food<T>: BaseClass, IInterface where T : Fruit {}