我有以下简单测试:
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')
有谁可以解释为什么在这种情况下结构被视为“托管”?
答案 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}}并确定。但与所有语言功能一样,它是功能,其实现不会有太多的返回值。