C# C型参数规范

C# C型参数规范,c#,generics,specifications,type-parameter,C#,Generics,Specifications,Type Parameter,mscorlib库中的某些特殊CLI类型(ArgIterator、TypedReference和RuntimeArgumentHandle类型)不能用作泛型类型参数来构造泛型类型/方法: void Foo<T>() { } void Bar() { Foo<ArgIterator>(); } 但这在C#规范中根本没有记录 这种类型是CLI规范的一部分,还是CLR实现提供的这种类型,上面描述的行为不应该在C#spec中记录?我相信这是因为这些类型是“特殊”的,因为它们不能

mscorlib库中的某些特殊CLI类型(
ArgIterator
TypedReference
RuntimeArgumentHandle
类型)不能用作泛型类型参数来构造泛型类型/方法:

void Foo<T>() { }
void Bar() { Foo<ArgIterator>(); }
但这在C#规范中根本没有记录


这种类型是CLI规范的一部分,还是CLR实现提供的这种类型,上面描述的行为不应该在C#spec中记录?

我相信这是因为这些类型是“特殊”的,因为它们不能转换为
对象
;只有可以转换为
对象的类型才能指定为类型参数。顺便说一句,指针也是如此

我找不到这是在哪里记录的(在4.4.1中记录了指针),但Eric Lippert在前几天的评论中提到了这一点


这仅仅是一个有趣的问题,还是您正在尝试使用这种东西做一些事情?

您提供的所有三个示例都是结构,而不是类,因此我怀疑这是问题的关键。上的文档中提供的示例还表明,如果在泛型中使用指向某个类型的指针,它将失败


首先,Jon再次证明了这一点——这些家伙是非常特殊的类型,其值不能转换为object,因此不能用作类型参数。所有类型参数必须是其值可转换为对象的类型

要回答有关文档的问题,请执行以下操作:

没有记录处理可变方法的任何特殊功能。它们不是C语言本身的一部分——该语言的一致性实现不需要能够与支持可变方法的语言进行互操作。这些特性也没有作为编译器文档的一部分记录在MSDN中。这些不是“官方支持”的功能

这是很不幸的,但预算有限,我想大多数人都会同意,我们最好编写功能并修复bug,而不是花钱记录那些99.99%的用户即使得到支持也永远不会使用的功能,尽管他们不支持


如果你想用可变方法在C#中进行互操作,那就靠你自己了。祝你好运

第8.2.4节调用值类型,这些值类型可以包含指向求值堆栈“byref-like”类型的指针,并说它们不能装箱。它明确调用了
System.RuntimeArgumentHandle
System.TypedReference
作为此类类型的示例,但没有提供详尽的列表。第9.4节继续指出,byref类型、类似byref的类型和System.Void不能用于实例化泛型类型或方法。

作为注释,当您尝试使用这种类型编译代码时,如果无法转换为对象,您可以从中获得更多乐趣。当您键入
(点)时,这里的所有方法都是VisualStudio的建议


也可以使用void,这并不奇怪。结构是允许的,ArgIterator不包含指针。我尝试了一个包含IntPtr字段的自定义结构,效果很好。正在努力查看导致错误的原因。也许它与外部或不安全的方法有关。当然,这只是一个有趣的综合示例,我使用mscorlib中的所有值类型测试了一些通用代码,发现了这个问题,但在C#spec中没有找到解释。。。我知道,这种类型非常特殊,ArgIterator实际上是一个大小不同的结构。。。但是没有解释!:)我错误地认为这些功能是“官方的”。谢谢你,埃里克!:)
error CS0306: The type 'System.ArgIterator' may not be used as a type argument
  ArgIterator.ReferenceEquals(new object(), new object());  // OK; static method inherited from System.Object

  var strange = default(ArgIterator);
  strange.End();          // OK; non-virtual method defined in the struct
  strange.GetHashCode();  // OK; method overridden in the struct
  strange.ToString();     // compile-time error; method overriden in System.ValueType, inherited but not overridden in the struct
  strange.GetType();      // compile-time error; non-virtual method inherited from System.Object