根据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代码片段可以完成这项工作呢?
答案 0 :(得分:3)
您必须感到困惑,使用csc编译的确切代码会在GenericParamConstraint表中生成三行。
在此上下文中,GenericParam U
的标记为2a000001,并且受System.ValueType TypeRef约束。 T
(2a00000a)受IFoo和IBaz TypeDefs约束。