静态 类 可以通过反射用作类型参数
Static classes can be used as type arguments via reflection
尝试使用静态 class 作为类型参数时,C# 编译器会抛出错误:
var test = new List<Math>();
error CS0718: `System.Math': static classes cannot be used as generic arguments
这已在这些问题中涵盖:
- C# - static types cannot be used as type arguments
- C# Static types cannot be used as parameters
然而,我刚刚意识到我可以通过反射创建类型,并且运行时不会报错:
var test = Activator.CreateInstance(typeof(List<>).MakeGenericType(typeof(Math)));
我得出的结论是否正确,CLR 级别支持,但语言级别不支持?
或者这是规范中的灰色区域,意味着我应该避免使用这些泛型构造类型?
如 BJ Myers 的评论所述,CLR 不了解 "static" classes。编译器错误是为了防止您做可能导致严重问题的事情。几乎总是有解决大多数此类错误的方法(在本例中使用反射),但是尝试将静态 class 作为参数传递时的错误很好地表明您不应该做您正在做的事情,除非你很清楚后果是什么
在这种情况下,您应该问问自己,为什么要传递静态 class?由于静态 class 不能引用数据或其他对象,因此没有必要传递它。如果您需要在没有显式引用的情况下调用静态 class 上的函数,您可以使用反射来调用它的方法。这是一个解释的答案:
Invoking static methods with reflection
尝试使用静态 class 作为类型参数时,C# 编译器会抛出错误:
var test = new List<Math>();
error CS0718: `System.Math': static classes cannot be used as generic arguments
这已在这些问题中涵盖:
- C# - static types cannot be used as type arguments
- C# Static types cannot be used as parameters
然而,我刚刚意识到我可以通过反射创建类型,并且运行时不会报错:
var test = Activator.CreateInstance(typeof(List<>).MakeGenericType(typeof(Math)));
我得出的结论是否正确,CLR 级别支持,但语言级别不支持?
或者这是规范中的灰色区域,意味着我应该避免使用这些泛型构造类型?
如 BJ Myers 的评论所述,CLR 不了解 "static" classes。编译器错误是为了防止您做可能导致严重问题的事情。几乎总是有解决大多数此类错误的方法(在本例中使用反射),但是尝试将静态 class 作为参数传递时的错误很好地表明您不应该做您正在做的事情,除非你很清楚后果是什么
在这种情况下,您应该问问自己,为什么要传递静态 class?由于静态 class 不能引用数据或其他对象,因此没有必要传递它。如果您需要在没有显式引用的情况下调用静态 class 上的函数,您可以使用反射来调用它的方法。这是一个解释的答案:
Invoking static methods with reflection