class MyClass
{
public void MyMethod(Type targetType = typeof(MyClass))
{
}
}
typeof(MyClass)
एक संकलन-समय निरंतर नहीं है?सी # डिफ़ॉल्ट पैरामीटर के रूप में टाइप प्रकार क्यों नहीं देता है?
class MyClass
{
public void MyMethod(Type targetType = typeof(MyClass))
{
}
}
typeof(MyClass)
एक संकलन-समय निरंतर नहीं है?सी # डिफ़ॉल्ट पैरामीटर के रूप में टाइप प्रकार क्यों नहीं देता है?
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
जरूरी एक संकलन समय निरंतर वापस नहीं करता है के रूप में यह संदर्भ के आधार पर अलग-अलग परिणाम वापस आ सकते हैं।
क्योंकि यह आवश्यक रूप से एक निरंतर अभिव्यक्ति नहीं है। आपके उदाहरण में एक साधारण वर्ग पर एक प्रकार है, लेकिन क्या होगा यदि वर्ग सामान्य था? स्पष्ट रूप से यह अब तक स्थिर नहीं है:
class MyClass<T>
{
public void MyMethod(Type targetType = typeof(MyClass<T>))
{
}
}
मैं एक आईएल विशेषज्ञ नहीं हूँ, लेकिन लगता है यह 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
Isn't
typeof(MyClass)
a compile-time constant?
विशेष अभिव्यक्ति स्थिर समाधान योग्य है कि, हाँ, लेकिन typeof()
, (जेनरिक की वजह से) निष्पादन समय पर मूल्यांकन किया जाता है तो नियम एक है कि होना चाहिए typeof()
कॉल संकलन-समय स्थिर नहीं है।
मुझे आश्चर्य है कि क्या यह सी # 1.0, जब ऐसी कोई तर्क दिया जा रहा था में था ...
का तर्क है, मुझे नहीं लगता कि जेनेरिक इसका एकमात्र कारण है। मुझे लगता है कि ऐसा इसलिए है क्योंकि यह काम करता है: 'टाइपऑफ (क्लासइनएक्सनेटएस्प्लोर)'। इसे वास्तविक बाहरी असेंबली लोड होने तक हल नहीं किया जा सकता है, और इसलिए, यह स्थिर नहीं है। – Aidiakapi
प्रकार 'को typeof' संकलन समय पर समाधान किया जाना चाहिए पारित कर दिया। इसलिए मैं नहीं देख सकता कि आपका क्या मतलब है। यदि आप जो कहते हैं वह सत्य है, तो गुणों को 'प्रकार स्थिरांक' भी अस्वीकार करना चाहिए। – leppie
लेप्पी, "एट्रिब्यूट्स" से आपका क्या मतलब है 'टाइप कॉन्स्टेंट' 'को अस्वीकार करना चाहिए? गुण गुणों को स्थिरांक कहां प्रतिबंधित करते हैं? –
@ फ़ूजी - विशेषता रचनाकारों में पारित पैरामीटर समय स्थिरांक संकलित करने की आवश्यकता है। – Oded