C#类型参数规范

con*_*low 11 c# generics specifications type-parameter

从一些特殊类型的CLI mscorlib程序库(ArgIterator,TypedReferenceRuntimeArgumentHandle类型)不能被用作一般类型参数构造通用类型/方法:

void Foo<T>() { }
void Bar() { Foo<ArgIterator>(); }
Run Code Online (Sandbox Code Playgroud)

提供编译器错误:

error CS0306: The type 'System.ArgIterator' may not be used as a type argument
Run Code Online (Sandbox Code Playgroud)

但是在C#规范中根本没有记录.

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

Eri*_*ert 10

首先,Jon再次正确 - 这些人是非常特殊的类型,其值不能转换为对象,因此不能用作类型参数.所有类型参数必须是其值可转换为对象的类型.

要回答有关文档的问题:

没有记录处理可变方法的特殊功能.它们不是C#语言本身的一部分 - 语言的一致性实现不需要能够与支持可变方法的语言互操作.MSDN中也没有将这些功能记录为编译器文档的一部分.这些不是"官方支持"功能.

这是不幸的,但是只有这么多的预算可用,而且我认为大多数人会同意我们更好地编写功能并修复错误,而不是花钱记录功能,即99.99%的用户永远不会使用这些功能.如果他们得到支持,他们不是.

如果您想使用可变方法在C#中进行互操作,那么您就可以自己动手了.祝好运!


Jon*_*eet 7

我相信这是因为这些类型是"特殊的",因为它们无法转换为object; 只能转换object为的类型可以指定为类型参数.顺便说一句,指针也是如此.

我找不到记录的位置(4.4.1中有关于指针的文档),但Eric Lippert前几天在评论中提到了它.

这仅仅是一个利益的事情,或者是你想真正做到用这种东西的东西吗?