为什么C#不允许typeof作为默认参数?

caz*_*tos 12 c# typeof default-parameters

class MyClass
{
    public void MyMethod(Type targetType = typeof(MyClass))
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

不是typeof(MyClass)编译时常量?

Fel*_*oto 10

我不是IL专家,但似乎它在L_0005调用了一个方法:

return typeof(int);
Run Code Online (Sandbox Code Playgroud)

它是相同的:

.maxstack 1
.locals init (
    [0] class [mscorlib]System.Type typeofvar)
L_0000: ldtoken int32
L_0005: call class [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)
L_000a: stloc.0 
L_000b: ldloc.0 
L_000c: ret 
Run Code Online (Sandbox Code Playgroud)

您可以看到它不是一种写入类型的代码:

const Type constType = typeof(int);
Run Code Online (Sandbox Code Playgroud)

这会返回一个错误:

Constant initialize must be compile-time constant
Run Code Online (Sandbox Code Playgroud)

  • +1回答他的问题并证明它不是编译时间常数的好方法 (2认同)

Ode*_*ded 5

从MSDN - 命名和可选参数:

默认值必须是以下类型的表达式之一:

  • 一个恒定的表达;

  • 表达式为新的ValType(),其中ValType是值类型,例如枚举或结构;

  • 形式为default(ValType)的表达式,其中ValType是值类型.


typeof 不一定返回编译时常量,因为它可能会根据上下文返回不同的结果.

  • Oded,规则是:Constant或typeof表达式或数组创建 (2认同)