为什么在泛型类中的嵌套结构被认为是“托管”的?

本文关键字:认为是 托管 结构 泛型类 嵌套 为什么 | 更新日期: 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
}

因为TC的一部分,也是A的一部分。这意味着A也是通用的。所有泛型类型都被认为是托管的。

我猜,有可能检查A是否使用T并决定这一点。但是和所有的语言特性一样,它是一个特性,它的实现不会有太多的返回值。