2012-01-20 26 views

答えて

5

からNamed and Optional Parameters:それは文脈に依存して異なる結果を返すことができるように

A default value must be one of the following types of expressions:

  • a constant expression;

  • an expression of the form new ValType(), where ValType is a value type, such as an enum or a struct;

  • an expression of the form default(ValType), where ValType is a value type.


typeofは、必ずしも一定のコンパイル時間を返しません。

+0

typeof'はコンパイル時に解決されなければならない 'に渡されるタイプ。それゆえ、私はあなたが何を意味するか見ることができません。あなたの言うことが真実ならば、属性は '型定数'も禁止する必要があります。 – leppie

+0

leppie、あなたは「属性は型定数も禁止するべきですか」という意味ですか?属性はどこの値を定数に制限しますか? –

+1

@Fujiy - 属性コンストラクタに渡されるパラメータは、時定数をコンパイルする必要があります。 – Oded

4

必ずしも定数式である必要はないからです。あなたの例では、単純なクラスの型を扱っていますが、クラスが汎用クラスの場合はどうなりますか?

class MyClass<T> 
{ 
    public void MyMethod(Type targetType = typeof(MyClass<T>)) 
    { 
    } 
} 
11

私はILの専門家ではないけど、それはL_0005でメソッドを呼び出しているようです:明らかに、これははるかに一定ではなく、

return typeof(int); 

It's同じの:

.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 

あなたはそれがコードの一定の書き込み型isn'taことがわかります。

const Type constType = typeof(int); 
をエラーを返し

ルールそのなければならないので

Constant initialize must be compile-time constant 
+2

彼の質問に答えて、それがコンパイル時定数ではないことを証明する良い方法 – mtijn

+0

'RuntimeTypeHandle'は定数です。 – leppie

+0

RuntimeTypeHandleは構造体です。とにかく、この変更は何ですか? RuntimeTypeHandleはメソッド呼び出しの引数にすぎません –

1

Isn't typeof(MyClass) a compile-time constant?

特定発現がYES、静的に解決されることを

が、typeof()は、(なぜならジェネリックの)実行時に評価されますtypeof()呼び出しはコンパイル時定数ではありません。

は私が...それがなされるべきそのような引数はありませんでしたC#1.0、中であったかどうかを疑問に思うん

+1

ジェネリックが唯一の理由だとは思いません。私はそれがうまくいくと思う: 'typeof(ClassInExternalAssembly)'。実際の外部アセンブリが読み込まれるまで解決できないため、定数ではありません。 – Aidiakapi

関連する問題