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

时间:2011-04-05 10:41:32

标签: .net clr metadata cil

根据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)
        {
        }
    }

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

1 个答案:

答案 0 :(得分:3)

您必须感到困惑,使用csc编译的确切代码会在GenericParamConstraint表中生成三行。

enter image description here

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