我有以下代码:
void DoSomething<T>() where T : class
{
if(typeof(T).IsAbstract)
// do something with T
else
// throw an error
}
是否可以强制T是泛型定义中的抽象类(类似where T : abstract class
)?
答案 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参数的运行时类型。由于定义中的抽象类无法实例化,因此这两个原则直接相矛盾。