【问题标题】:Static classes can be used as type arguments via reflection静态类可以通过反射用作类型参数
【发布时间】:2017-09-26 23:54:47
【问题描述】:

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

var test = new List<Math>();

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

这些问题已经涵盖了这一点:

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

var test = Activator.CreateInstance(typeof(List&lt;&gt;).MakeGenericType(typeof(Math)));

我是否认为 CLR 级别支持这一点,但语言级别不支持?

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

【问题讨论】:

  • CLR 支持它,因为static 只是一个 C# 构造。静态类在 CLR 中编译为 abstract sealed,这会阻止它们被实例化。更多信息在这里:stackoverflow.com/questions/25643276/…
  • 也许这是创建一个只能包含 NULL 的 List 的好方法 :)

标签: c# .net reflection clr


【解决方案1】:

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

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

Invoking static methods with reflection

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多