Подтвердить что ты не робот

Почему вложенная структура внутри общего класса считается "управляемой"?

У меня есть следующий простой тест:

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

Может ли кто-нибудь объяснить, почему структура считается "управляемой" в этом сценарии?

4b9b3361

Ответ 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 и принять решение об этом. Но, как и во всех языковых функциях, это функция, реализация которой не будет иметь большого возвращаемого значения.