Если <T1, T2> является шаблоном для фактического типа, то, почему typeof (<,>) позволен?

class Program
{
    static void Main(string[] args)
    {
        Type t = typeof(A<,>);
        Console.WriteLine(typeof(A<,>)); // prints A'2[T1,T2]
    }    
}

class A<T1,T2>
{

}

Насколько я знаю, универсальный тип A<T1, T2> разве фактический тип не, а скорее проект/шаблон фактического типа, итак, почему делает typeof примите его в качестве параметра (так как насколько я знаю, typeof принимает как параметр фактические типы)?

Спасибо

7
задан ShreevatsaR 10 July 2010 в 19:09
поделиться

3 ответа

В отражении неструктурированный универсальный тип, скажем C <> , объединен с типом экземпляра C .

Это, возможно, менее чисто теоретически; Я считаю их очень разными сущностями.Я думаю об одном как о символе «C с одним параметром типа», а о другом как о типе времени компиляции C . В коде C <> и C не являются синонимами друг для друга; вы можете создать поле второго типа, если T находится в области видимости, но вы никогда не сможете создать поле первого типа.

То, что библиотека отражения дает вам тип типа экземпляра, когда вы запрашиваете неструктурированный тип, не так уж плохо. Что бы вы сделали с неконструированным типом? Вы действительно ничего не можете с этим поделать. Но с типом экземпляра здесь вы можете сказать «заменить int на T».

Настоящее преимущество получения C , когда вы запрашиваете typeof (C <>) , заключается в том, что это всегда дает вам неструктурированный тип. Сравните:

class C<T>
{
    public static Type CT() { return typeof(C<T>); }
    public static Type JustC() { return typeof(C<>); }
}

Когда вы звоните в CT, как вы собираетесь называть его на ? Нет типа C для вызова CT. Вы можете позвонить C .CT , и в этом случае вы получите ответ C , а не C . Единственный способ получить тип C <> , построенный с помощью T, - это запросить typeof (C <>) .

Имеет ли это смысл?

Я еще не рассмотрел отражение (у меня смутное представление о том, что это такое)

Отражение - это просто библиотека кода, которая позволяет вам получать информацию о вашем коде в сам код. «typeof» дает вам объект Type, который вы затем можете «поразмышлять», чтобы узнать информацию о типе.

Я не уверен, что понимаю, что вы имеете в виду, говоря «даже когда T не входит в область видимости».

То, как я это сказал, сбивает с толку.Я перефразировал это.

4
ответ дан 7 December 2019 в 03:10
поделиться

Он принят, потому что это общий тип.

Это открытый универсальный тип (где параметры типа не были указаны), но тип тем не менее.

См. обсуждение здесь (Что именно является «открытым универсальным типом»).

А на MSDN (typeof):

Оператор typeof также можно использовать для открытых универсальных типов.

4
ответ дан 7 December 2019 в 03:10
поделиться

Поскольку A является открытым универсальным, что в документации явно указано, что он поддерживает.

1
ответ дан 7 December 2019 в 03:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: