为什么在泛型类中的嵌套结构被认为是“托管”的?
本文关键字:认为是 托管 结构 泛型类 嵌套 为什么 | 更新日期: 2023-09-27 18:19:22
我有以下简单的测试:
class C<T>
{
public struct A
{
int x;
}
}
class Program
{
static unsafe void Main(string[] args)
{
IntPtr p = new IntPtr();
var a = (C<int>.A*)p.ToPointer();
}
}
生成错误CS0208:
Cannot take the address of, get the size of, or declare a pointer to a managed
type ('C<int>.A')
谁能解释为什么这个结构在这个场景中被认为是"托管的"?
c# 5规范第18.2节:
非托管类型是指不是引用类型或构造类型的任何类型,并且在任何嵌套级别上都不包含引用类型或构造类型字段。
现在您可能想知道C<int>.A
是否符合构造类型的条件(它显然不是引用类型)。答案是肯定的。第4.4节定义了构造类型。它特别指出,嵌套类型被认为是构造的。它以下面的Outer<T>.Inner
为例:
class Outer<T>
{
public class Inner {...}
public Inner i; // Type of i is Outer<T>.Inner
}
因为T
是C
的一部分,也是A
的一部分。这意味着A
也是通用的。所有泛型类型都被认为是托管的。
我猜,有可能检查A
是否使用T
并决定这一点。但是和所有的语言特性一样,它是一个特性,它的实现不会有太多的返回值。