通用参数约束的哪些组合将使C#编译器为GenericParamConstraint元数据表生成行?

pla*_*ano 5 .net clr cil metadata

根据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)
        {
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

Jb *_*ain 3

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

在此输入图像描述

在此上下文中,GenericParamU的标记为 2a000001,并且受 System.ValueType TypeRef 约束。T(2a00000a) 受 IFoo 和 IBaz TypeDef 约束。