class MyClass
{
public void MyMethod(Type targetType = typeof(MyClass))
{
}
}
typeof(MyClass)
コンパイル時定数ではありませんか?
class MyClass
{
public void MyMethod(Type targetType = typeof(MyClass))
{
}
}
typeof(MyClass)
コンパイル時定数ではありませんか?
私は IL の専門家ではありませんが、L_0005 でメソッドを呼び出しているようです:
return typeof(int);
それは同じです:
.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
コードの書き込みタイプが一定ではないことがわかります。
const Type constType = typeof(int);
それはエラーを返します:
Constant initialize must be compile-time constant
MSDNから-名前付きおよびオプションのパラメーター:
デフォルト値は、次のタイプの式のいずれかである必要があります。
定数式;
new ValType()形式の式。ここで、ValTypeは、列挙型や構造体などの値型です。
default(ValType)形式の式。ここで、ValTypeは値型です。
typeof
コンテキストに応じて異なる結果を返す可能性があるため、必ずしもコンパイル時定数を返すとは限りません。
必ずしも定数式ではないためです。あなたの例は単純なクラスの typeof を特徴としていますが、クラスがジェネリックだったらどうでしょうか? 明らかにこれはずっと一定ではありません:
class MyClass<T>
{
public void MyMethod(Type targetType = typeof(MyClass<T>))
{
}
}
typeof(MyClass)
コンパイル時の定数ではありませんか?
その特定の式は静的に解決可能ですが、typeof()
(ジェネリックのため) 実行時に評価されるため、呼び出しがコンパイル時の定数ではないという規則が必要です。typeof()
そのような議論がなされなかったとき、それはC#1.0にあったのだろうか...