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

Статические классы могут использоваться как аргументы типа через отражение

При попытке использовать статический класс как параметр типа компилятор С# выдает ошибку:

var test = new List<Math>();

ошибка CS0718: `System.Math ': статические классы не могут использоваться в качестве общих аргументов

Это было рассмотрено в этих вопросах:

Однако я просто понял, что могу создать тип через отражение, и среда выполнения не будет жаловаться:

var test = Activator.CreateInstance(typeof(List<>).MakeGenericType(typeof(Math)));

Согласен ли я, что это поддерживается на уровне CLR, но не на уровне языка?

Или это серая область в спецификациях, то есть я должен воздержаться от использования этих общих построенных типов?

4b9b3361

Ответ 1

Как указано в комментарии от BJ Myers, CLR не знает "статические" классы. Ошибки компилятора заключаются в том, что вы не можете делать что-то, что может вызвать серьезные проблемы. Почти так много ошибок, как это (в данном случае с использованием отражения), но ошибка при попытке передать статический класс в качестве параметра является хорошим показателем того, что вы не должны делать то, что делаете, если не знаете очень хорошо каковы последствия.

В этом случае вы должны спрашивать себя, почему вы хотите передать статический класс? Поскольку статический класс не может иметь ссылок на данные или другие объекты, нет смысла передавать это. Если вам нужно вызывать функции в статическом классе, не имея явной ссылки на него, вы можете использовать отражение для вызова его методов. Вот ответ, объясняющий, что:

Вызов статических методов с отражением