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

时间:2014-08-25 08:48:20

标签: c#

我有以下简单测试:

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')

有谁可以解释为什么在这种情况下结构被视为“托管”?

2 个答案:

答案 0 :(得分:20)

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
}

答案 1 :(得分:7)

因为T C的一部分A也是A的一部分。这意味着A也是通用的。并且所有通用类型都被视为托管。

我想,可以检查T是否使用{{1}}并确定。但与所有语言功能一样,它是功能,其实现不会有太多的返回值。