Почему вложенная структура внутри общего класса считается "управляемой"?
У меня есть следующий простой тест:
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')
Может ли кто-нибудь объяснить, почему структура считается "управляемой" в этом сценарии?
Ответы
Ответ 1
Раздел 18.2 спецификации С# 5:
Неуправляемый тип - это любой тип, который не является ссылочным типом или сконфигурированным типом и не содержит типов ссылочного типа или построенного типа на любом уровне вложенности.
Теперь вы можете задаться вопросом, квалифицируется ли C<int>.A
как построенный тип (его явно не ссылочный тип). Ответ - да. Раздел 4.4 определяет построенные типы. В нем конкретно говорится, что вложенные типы считаются построенными. В качестве примера он использует Outer<T>.Inner
ниже:
class Outer<T>
{
public class Inner {...}
public Inner i; // Type of i is Outer<T>.Inner
}
Ответ 2
Потому что T
, являющийся частью C
, также является частью A
. Это означает, что A
также является общим. И все общие типы считаются управляемыми.
Я думаю, можно было бы проверить, использует ли A
T
и принять решение об этом. Но, как и во всех языковых функциях, это функция, реализация которой не будет иметь большого возвращаемого значения.