0

Будет ли typeof(T) == typeof(string), где T является аргументом общего типа, скомпилируется в константное булево значение, поскольку условие является познаваемым во время компиляции?Будет ли это сравнение скомпилировано в константное булево значение в общем классе?

+1

Нет, это не так. Почему он должен компилироваться в константу? Генерируемые типы в .NET строятся во время выполнения. – Dennis

+0

Не так много, как должно было бы, поскольку это было бы разрешимо во время компиляции, если бы оно было скомпилировано подобно шаблонам C++. В этом случае он, безусловно, должен компилироваться в константу как оптимизацию, но не в C#, так как типы сохраняют свои общие параметры типа во время выполнения. Я выполнял довольно много работы с отражением и построением родовых типов во время выполнения, но кто-то пытался сказать мне, что они такие же, как шаблоны C++, скомпилированные в отдельный тип для каждого используемого типового типа, и я сомневался в том, что знал для минута. Просто расчистить вещи. – Triynko

ответ

4

Данные общего типа существуют в ИЛ - он не стирается, как в Java. Итак: no, C# компилятор не скомпилирует это константу; он компилирует его в ИЛ, который говорит о типичном параметре типа.

JIT- на этом затем повторно для всех перестановок ссылочного типа (только каждое значение типа перестановки требует отдельного JIT, для размера/бокс/и т.д. причины). Поскольку string является ссылочным типом, это означает, что Foo<string> (где typeof(T)==typeof(string) - true) использует тот же вывод JIT, что и Foo<SomeClass> (где typeof(T)==typeof(string) - false). Итак, нет: это явно не константа, даже во время JIT.

+0

Так будет ли это также применяться к примитивному типу типа 'typeof (T) == typeof (int)'? Или JIT сможет оптимизировать это до постоянной? – Triynko

+0

@ Трийнко, это интересный вопрос, и это будет зависеть от JIT. Теоретически да: это * хорошо известно, потому что он будет JIT для всех значений типа T, поэтому 'typeof (T)' в случае 'int' будет приводим. Независимо от того, делает ли это ** **, это потребует рассмотрения созданного машинного кода. Я не знаю, в принципе. –