13
class MyClass
{
    public void MyMethod(Type targetType = typeof(MyClass))
    {
    }
}

typeof(MyClass)コンパイル時定数ではありませんか?

4

5 に答える 5

11

私は 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
于 2012-01-20T09:57:12.097 に答える
5

MSDNから-名前付きおよびオプションのパラメーター

デフォルト値は、次のタイプの式のいずれかである必要があります。

  • 定数式;

  • new ValType()形式の式。ここで、ValTypeは、列挙型や構造体などの値型です。

  • default(ValType)形式の式。ここで、ValTypeは値型です。


typeofコンテキストに応じて異なる結果を返す可能性があるため、必ずしもコンパイル時定数を返すとは限りません。

于 2012-01-20T09:49:57.663 に答える
4

必ずしも定数式ではないためです。あなたの例は単純なクラスの typeof を特徴としていますが、クラスがジェネリックだったらどうでしょうか? 明らかにこれはずっと一定ではありません:

class MyClass<T>
{
  public void MyMethod(Type targetType = typeof(MyClass<T>))
  {
  }
} 
于 2012-01-20T09:55:32.490 に答える
1

typeof(MyClass)コンパイル時の定数ではありませんか?

その特定の式は静的に解決可能ですが、typeof()(ジェネリックのため) 実行時に評価されるため、呼び出しがコンパイル時の定数ではないという規則が必要です。typeof()

そのような議論がなされなかったとき、それC#1.0にあったのだろうか...

于 2012-01-20T10:22:06.613 に答える