静态类可以通过反射用作类型参数

Laz*_*zlo 14 .net c# reflection clr

当尝试使用静态类作为类型参数时,C#编译器将抛出错误:

var test = new List<Math>();

错误CS0718:`System.Math':静态类不能用作泛型参数

这些已在以下问题中涵盖:

但是,我刚刚意识到我可以通过反射创建类型,运行时不会抱怨:

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

我是否正确地得出结论,这是在CLR级别支持,但不是在语言级别?

或者这是规格中的灰色区域,这意味着我应该避免使用这些通用的构造类型?

小智 3

正如 BJ Myers 的评论中所述,CLR 不了解“静态”类。编译器错误是为了防止您执行可能导致严重问题的操作。几乎总有办法解决像这样的大多数错误(在本例中使用反射),但是尝试将静态类作为参数传递时的错误很好地表明您不应该做您正在做的事情,除非您非常了解后果是什么。

在这种情况下,您应该问自己,为什么要传递静态类?由于静态类不能引用数据或其他对象,因此没有必要传递它。如果需要在静态类上调用函数而无需显式引用它,则可以使用反射来调用其方法。这是一个答案,解释了这一点:

通过反射调用静态方法