class MyClass
{
public void MyMethod(Type targetType = typeof(MyClass))
{
}
}
typeof(MyClass)
はコンパイル時定数ではありませんか? MSDNからなぜC#は型パラメータをデフォルトパラメータとして許可しないのですか?
class MyClass
{
public void MyMethod(Type targetType = typeof(MyClass))
{
}
}
typeof(MyClass)
はコンパイル時定数ではありませんか? MSDNからなぜC#は型パラメータをデフォルトパラメータとして許可しないのですか?
から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
は、必ずしも一定のコンパイル時間を返しません。
必ずしも定数式である必要はないからです。あなたの例では、単純なクラスの型を扱っていますが、クラスが汎用クラスの場合はどうなりますか?
class MyClass<T>
{
public void MyMethod(Type targetType = typeof(MyClass<T>))
{
}
}
私は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
特定発現がYES、静的に解決されることをIsn't
typeof(MyClass)
a compile-time constant?
が、typeof()
は、(なぜならジェネリックの)実行時に評価されますtypeof()
呼び出しはコンパイル時定数ではありません。
は私が...それがなされるべきそのような引数はありませんでしたC#1.0、中であったかどうかを疑問に思うん
ジェネリックが唯一の理由だとは思いません。私はそれがうまくいくと思う: 'typeof(ClassInExternalAssembly)'。実際の外部アセンブリが読み込まれるまで解決できないため、定数ではありません。 – Aidiakapi
typeof'はコンパイル時に解決されなければならない 'に渡されるタイプ。それゆえ、私はあなたが何を意味するか見ることができません。あなたの言うことが真実ならば、属性は '型定数'も禁止する必要があります。 – leppie
leppie、あなたは「属性は型定数も禁止するべきですか」という意味ですか?属性はどこの値を定数に制限しますか? –
@Fujiy - 属性コンストラクタに渡されるパラメータは、時定数をコンパイルする必要があります。 – Oded