2012-01-20 32 views

उत्तर

5

MSDN से - 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

लेप्पी, "एट्रिब्यूट्स" से आपका क्या मतलब है 'टाइप कॉन्स्टेंट' 'को अस्वीकार करना चाहिए? गुण गुणों को स्थिरांक कहां प्रतिबंधित करते हैं? –

+1

@ फ़ूजी - विशेषता रचनाकारों में पारित पैरामीटर समय स्थिरांक संकलित करने की आवश्यकता है। – Oded

4

क्योंकि यह आवश्यक रूप से एक निरंतर अभिव्यक्ति नहीं है। आपके उदाहरण में एक साधारण वर्ग पर एक प्रकार है, लेकिन क्या होगा यदि वर्ग सामान्य था? स्पष्ट रूप से यह अब तक स्थिर नहीं है:

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

मैं एक आईएल विशेषज्ञ नहीं हूँ, लेकिन लगता है यह 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 

आप देख सकते हैं कि यह कोड के निरंतर लेखन प्रकार isn'ta:

const Type constType = typeof(int); 

एक त्रुटि देता है कि:

Constant initialize must be compile-time constant 
+2

+1 अपने प्रश्न का उत्तर देने का अच्छा तरीका है और साबित करता है कि यह संकलन समय स्थिर नहीं है – mtijn

+0

'रनटाइम टाइपइपल' स्थिर है, हालांकि। – leppie

+0

रनटाइम टाइपपेन्डल एक संरचना है। वैसे भी, यह परिवर्तन क्या है? RuntimeTypeHandle विधि कॉल –

1

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

विशेष अभिव्यक्ति स्थिर समाधान योग्य है कि, हाँ, लेकिन typeof(), (जेनरिक की वजह से) निष्पादन समय पर मूल्यांकन किया जाता है तो नियम एक है कि होना चाहिए typeof() कॉल संकलन-समय स्थिर नहीं है।

मुझे आश्चर्य है कि क्या यह सी # 1.0, जब ऐसी कोई तर्क दिया जा रहा था में था ...

+1

का तर्क है, मुझे नहीं लगता कि जेनेरिक इसका एकमात्र कारण है। मुझे लगता है कि ऐसा इसलिए है क्योंकि यह काम करता है: 'टाइपऑफ (क्लासइनएक्सनेटएस्प्लोर)'। इसे वास्तविक बाहरी असेंबली लोड होने तक हल नहीं किया जा सकता है, और इसलिए, यह स्थिर नहीं है। – Aidiakapi