.NET 泛型 : Is it possible to enforce abstract class on generic type

标签 .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)?

最佳答案

这是不可能的。参见 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);

关于.NET 泛型 : Is it possible to enforce abstract class on generic type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4249362/

相关文章:

java - 是否有支持泛型类型的 XML 模式的替代方案?

java - 原始类型和泛型——Java

c# - 使用类型参数约束实现两次相同的通用接口(interface)

c# - 未找到 DBSet<entity> 类( Entity Framework 加载错误的 DLL?)

c# - 从列表框项目到具有重复项目的文本框

.net - Owin 获取查询字符串参数

当涉及泛型(特别是 List)时,通过继承重用 Java 代码?

c# - Autofac:将所有 MediatR 处理程序注册为泛型类型的内部类

c# - 使用存储 C#.Net CNG 中的 key 的 ECDSA 签名文件

c# - 通过 C#.Net 使用 AT 命令发送短信