2012-01-20 21 views

cevap

5

-Named and Optional Parameters: bu duruma bağlı olarak farklı sonuçlar döndürebilir olarak

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

zorunlu olarak sabit bir derleme bir döndürmez. Her zaman sabit bir ifade olmadığı için

+0

typeof' derleme zamanında çözülmesi gerektiğini 'geçirilen türü. Bu yüzden ne demek istediğini göremiyorum. Söyledikleriniz doğruysa, nitelikler de 'tip sabitlerine' izin vermemelidir. – leppie

+0

leppie, "nitelikler de" tip sabitlerine izin vermemeli "ile ne demek istiyorsun? Nitelikler değerleri sabit olarak nerede sınırlar? –

+1

@Fujiy - Öznitelik yapısından geçirilen parametrelerin, zaman sabitlerinin derlenmesi gerekir. – Oded

4

. örneğiniz, basit bir sınıfta bir yazım özelliği sunuyor, ancak sınıf jenerikse ne olurdu?

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

Bir IL uzmanı değilim ama L_0005 bir yöntemini çağırır görünüyor: Açıkçası bu kadar sabit değildir

return typeof(int); 

IT'S aynısının:

.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 

bunu kod sabit yazı tipini tutmaz görebilirsiniz:

const Type constType = typeof(int); 
bir hata verir

: kural bir şekilde olmalıdır, böylece

Constant initialize must be compile-time constant 
+2

+1 sorusunu yanıtlamanın güzel bir yolu ve bunun bir derleme zamanı sabiti olmadığını ispatlamak – mtijn

+0

"RuntimeTypeHandle" sabittir. – leppie

+0

RuntimeTypeHandle bir yapıdır. Neyse, bu değişim nedir? RuntimeTypeHandle yöntem çağrısı yalnızca –

1

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

özellikle sentezleme evet statik çözülebilir olan bu

ancak typeof(), (nedeniyle jenerik) yürütülmesi sırasında değerlendirilir typeof() çağrısı derleme zamanı sabiti değildir.

günde ... yapılacak böyle bir argüman yoktu C# 1.0, içinde olup olmadığını merak ediyorsun

+1

argümanıdır. Bunun jenerik olduğunu düşünüyorum. Bunun işe yaradığını düşünüyorum: 'typeof (ClassInExternalAssembly) '. Gerçek harici montaj yüklenene kadar çözülemez ve bu nedenle sabit değildir. – Aidiakapi

İlgili konular