उपाय
आप new Guid()
इसके बजाय उपयोग कर सकते हैं
public void Problem(Guid optional = new Guid())
{
// when called without parameters this will be true
var guidIsEmpty = optional == Guid.Empty;
}
आप भी उपयोग कर सकते हैं default(Guid)
default(Guid)
यह भी बिल्कुल उसी तरह काम करेगा new Guid()
।
क्योंकि गाइड एक वैल्यू टाइप है न कि रेफरेंस टाइप, इसलिए, उदाहरण के लिए default(Guid)
बराबर नहीं है null
, इसके बजाय, यह डिफॉल्ट कंस्ट्रक्टर को कॉल करने के बराबर है।
जिसका अर्थ है कि यह:
public void Problem(Guid optional = default(Guid))
{
// when called without parameters this will be true
var guidIsEmpty = optional == Guid.Empty;
}
यह मूल उदाहरण के समान ही है।
व्याख्या
Guid.Empty
काम क्यों नहीं किया?
आप त्रुटि प्राप्त कर रहे हैं इसका कारण Empty
यह है:
public static readonly Guid Empty;
तो, यह एक वैरिएबल है, न कि एक स्थिर (जैसा static readonly
नहीं है const
)। कंपाइलर में केवल कंपाइलर-ज्ञात मान हो सकते हैं क्योंकि विधि पैरामीटर डिफ़ॉल्ट मान (रनटाइम-ओनली-ज्ञात नहीं)।
मूल कारण यह है कि उदाहरण के विपरीत, आपके पास कोई const
भी नहीं हो सकता है । यदि आप इसे आजमाते हैं, तो यह संकलन नहीं करेगा।struct
enum
एक बार और कारण यह है कि struct
एक आदिम प्रकार नहीं है।
.NET में सभी आदिम प्रकारों की सूची के लिए http://msdn.microsoft.com/en-gb/library/system.typecode.aspx
( enum
आमतौर पर विरासत में मिला नोट int
, जो एक आदिम है) देखें
लेकिन new Guid()
एक स्थिर भी नहीं है!
मैं यह नहीं कह रहा हूं कि इसे एक निरंतरता की जरूरत है। इसे कुछ ऐसा चाहिए जो संकलन समय में तय किया जा सके। Empty
एक क्षेत्र है, इसलिए, यह संकलित समय में ज्ञात नहीं है (केवल रन समय के बहुत शुरुआत में)।
डिफ़ॉल्ट पैरामीटर मान को संकलित-समय पर जाना चाहिए, जो एक const
मान हो सकता है , या C # सुविधा का उपयोग करके परिभाषित कुछ ऐसा हो सकता है जो संकलन समय पर मूल्य ज्ञात करता है, जैसे ( default(Guid)
या new Guid()
जो संकलन समय पर संकलित करने का निर्णय लिया गया है struct
क्योंकि आप struct
कंस्ट्रक्टर को संशोधित नहीं कर सकते हैं कोड)।
जब आप प्रदान default
या new
आसानी से कर सकते हैं, तो आप एक प्रदान नहीं कर सकते const
(क्योंकि यह एक आदिम प्रकार नहीं है या enum
जैसा कि ऊपर बताया गया है)। तो, फिर से, यह नहीं कह रहा है कि वैकल्पिक पैरामीटर को स्वयं एक स्थिर, लेकिन संकलक ज्ञात मूल्य की आवश्यकता है।