.net 什么样的泛型参数约束组合将使C#编译器为GenericParamConstraint元数据表生成行?

.net 什么样的泛型参数约束组合将使C#编译器为GenericParamConstraint元数据表生成行?,.net,clr,metadata,cil,.net,Clr,Metadata,Cil,根据CLR的GenericParamConstraint表的Partition II元数据规范 GenericParamConstraint表 记录每个约束的约束 泛型参数。每种属 参数可以约束为派生 从零级到一级。每种属 参数可以约束为 实现零个或多个接口 问题是,我似乎找不到正确的C代码片段,无法让C编译器在GenericParamConstraint表中生成一行。我试过使用 public interface IFoo { } public interfac

根据CLR的GenericParamConstraint表的Partition II元数据规范

GenericParamConstraint表 记录每个约束的约束 泛型参数。每种属 参数可以约束为派生 从零级到一级。每种属 参数可以约束为 实现零个或多个接口

问题是,我似乎找不到正确的C代码片段,无法让C编译器在GenericParamConstraint表中生成一行。我试过使用

    public interface IFoo
    {
    }

    public interface IBaz
    {
    }

    public interface IBar
    {
    }
    public class Foo
    {

    }
    public class SampleClassWithGenericParamConstraint<T>
        where T : IFoo, IBaz, new()
    {
        public void DoSomething<U>(U arg1)
            where U : struct
        {
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
        }
    }
公共接口IFoo
{
}
公共接口IBaz
{
}
公共接口IBar
{
}
公开课Foo
{
}
公共类SampleClassWithGenericParamConstraint
其中T:IFoo,IBaz,new()
{
公共无效剂量测定(U arg1)
其中U:struct
{
}
}
班级计划
{
静态void Main(字符串[]参数)
{
}
}

..但问题是C#编译器只为GenericParam表生成行,而不是为GenericParamConstraint表添加行。所以我的问题是——是否有任何用C#编写的代码示例会迫使C#编译器向GenericParamConstraint表添加元数据行,以便我可以使用示例二进制文件?如果这是对C#编译器部分的某种限制,那么是否有一个等效的ILASM代码段可以替代这项工作?

您一定会感到困惑,您发布的使用csc编译的确切代码会在GenericParamConstraint表中产生三行

在此上下文中,GenericParam
U
的标记为2A00001,并受System.ValueType TypeRef的约束<代码>T(2A0000A)受IFoo和IBaz TYPEDEF的约束