为什么typeof(int).ToString()不是常量?

use*_*567 2 c# compiler-errors typeof tostring switch-statement

我正在尝试这样做:

const string intType = typeof(int).ToString();
switch (typeof(MyT).ToString())
{
    case intType:
    {
        return "int";
        break;
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

但编译说:

错误CS0133:分配给'intType'的表达式必须是常量

据我所知,typeof运算符在编译时工作.那么,怎么了?

Eri*_*ert 13

据我所知,typeof运算符在编译时工作.

你不知道,因为知识必须是真实的.你在哪里得到了typeof在编译时执行的想法?它产生一个非常数对象.然后无法保证ToString每次运行时都不会生成不同的字符串,因此也不能将其视为常量.

那么,怎么了?

你是从错误的信念中推理出来的.

C#规范清楚地描述了表达式作为编译时常量必须满足的条件.这些条件包括不包含任何typeof运算符或方法调用的表达式.

但这里有更大的问题.我假设这MyT是一个泛型类型参数,这意味着您正在尝试打开泛型类型参数的值.这几乎总是错误的做法.

你真的想做什么?你真的想解决什么问题?因为到目前为止你所展示的这段代码表明你正在走一条非生产性的道路去解决真正的问题.

  • @ user1234567:啊,我现在看到你困惑的根源; 谢谢你的澄清.是的,`GetType`返回对象的运行时*已知的类型*,`typeof`作为其操作数*编译器*类型已知.但这并不意味着在编译时*执行*操作,这是表达式为常量所必需的.`typeof`表达式生成一个类型为`Type`的对象,它是一个运行时对象. (4认同)