.NET Generics:是否可以在泛型类型上强制执行抽象类

时间:2010-11-22 19:24:43

标签: .net generics

我有以下代码:

void DoSomething<T>() where T : class
{
    if(typeof(T).IsAbstract)
         // do something with T
    else
         // throw an error
}

是否可以强制T是泛型定义中的抽象类(类似where T : abstract class)?

2 个答案:

答案 0 :(得分:4)

这是不可能的。参见C#规范的§10.1.5。特别是,语法清楚地表明这是不可能的。

type-parameter-constraints-clauses:
    type-parameter-constraints-clause
    type-parameter-constraints-clauses   type-parameter-constraints-clause
type-parameter-constraints-clause:
    where   type-parameter   :   type-parameter-constraints
type-parameter-constraints:
    primary-constraint
    secondary-constraints
    constructor-constraint
    primary-constraint   ,   secondary-constraints
    primary-constraint   ,   constructor-constraint
    secondary-constraints   ,   constructor-constraint
    primary-constraint   ,   secondary-constraints   ,   constructor-constraint
primary-constraint:
    class-type
    class
    struct
secondary-constraints:
    interface-type
    type-parameter
    secondary-constraints   ,   interface-type
    secondary-constraints   ,   type-parameter
constructor-constraint
    new   (   )

你可以在方法体中有一个保护条款:

Contract.Requires<InvalidOperationException>(!typeof(T).IsAbstract);

答案 1 :(得分:0)

泛型类型声明在第一次实例化时根据泛型类型(我认为)生成每个T参数的运行时类型。由于定义中的抽象类无法实例化,因此这两个原则直接相矛盾。