दशमलव मानों का उपयोग c # में विशेषता पराक्रम के रूप में करें?


81

मैं एक क्षेत्र विशेषता के लिए दशमलव मानों को परम के रूप में उपयोग करने की कोशिश कर रहा हूं, लेकिन मुझे एक संकलक त्रुटि मिलती है।

मैंने इस ब्लॉग पोस्ट लिंक को यह कहते हुए पाया कि इसका उपयोग करने के लिए .NET में संभव नहीं था, क्या किसी को पता है कि वे इसे क्यों चुनते हैं या मैं दशमलव परमर्स का उपयोग कैसे कर सकता हूं?


जवाबों:


123

यह एक सीएलआर प्रतिबंध है। केवल आदिम स्थिरांक या प्राथमिकताओं के सरणियों को विशेषता मापदंडों के रूप में उपयोग किया जा सकता है। कारण यह है कि एक विशेषता को पूरी तरह से मेटाडेटा में एन्कोड किया जाना चाहिए। यह एक विधि निकाय से अलग है जिसे IL में कोडित किया गया है। मेटाडेटा का उपयोग केवल उन मानों के दायरे को गंभीर रूप से प्रतिबंधित करता है जिनका उपयोग किया जा सकता है। सीएलआर के वर्तमान संस्करण में, मेटाडेटा मान आदिमता, अशक्त, प्रकार और प्राथमिकताओं के सरणियों तक सीमित हैं (एक छोटी सी याद हो सकती है)।

दशमलव, जबकि एक मूल प्रकार एक आदिम प्रकार नहीं है और इसलिए इसे मेटाडेटा में नहीं दिखाया जा सकता है जो इसे एक विशेषता पैरामीटर होने से रोकता है।


5
क्या यह अभी भी फ्रेमवर्क 4.0 के साथ एक मुद्दा है? और 4.5, 4.6.x?
मिडस्पैस

@ midspace, वास्तव में एक मुद्दा नहीं है, बस एक सीमा है, डिजाइन द्वारा लगाया गया है। यह दुर्भाग्यपूर्ण है, लेकिन अच्छी संभावना है कि यह कभी दूर नहीं जा सकता है।
ब्रूनो ब्रेंट

1
"केवल आदिम स्थिरांक या प्राथमिकताओं के सरणियों को विशेषता मापदंडों के रूप में उपयोग किया जा सकता है।" उदाहरण के लिए, यह बिल्कुल सही नहीं लगता है। System.Type की भी अनुमति है: msdn.microsoft.com/en-us/library/aa664615(v=vs.71).aspx
DixonD

Using MetaData only severely restricts the scope of values that can be used- हालांकि वह क्यों है? मेटाडेटा का उपयोग टाइप परिभाषाओं को इंगित करने के लिए किया जा सकता है। उदाहरण के लिए, जब आप किसी क्षेत्र को एक नियमित कक्षा में परिभाषित करते हैं, तो मेटाडेटा उत्सर्जित होता है, जिसमें फ़ील्ड का नाम भी शामिल होता है और यह टाइप होता है (कोई भी प्रकार, जूट प्राइमिटिव नहीं)। मुझे समझ में नहीं आता है कि इसका उपयोग विशेषताओं के लिए क्यों नहीं किया जा सकता है।
विंग

16

मेरी भी यही समस्या है। मैं तार का उपयोग करने पर विचार करता हूं । यह प्रकार-सुरक्षित नहीं है, लेकिन यह पठनीय है और मुझे लगता है कि हम स्ट्रिंग में मान्य संख्याओं को लिखने में सक्षम होंगे :-)।

class BlahAttribute : Attribute
{
  private decimal value;

  BlahAttribute(string number)
  {
    value = decimal.Parse(number, CultureInfo.InvariantCulture);
  }
}

[Blah("10.23")]
class Foo {}

यह एक सौंदर्य नहीं है, लेकिन सभी विकल्पों पर विचार करने के बाद, यह काफी अच्छा है।


1
ऐसा लगता है कि कैसे mbUnit copes vkreynin.wordpress.com/2007/05/25/…
एंडी डेंट

2

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


1

विशेषताओं के साथ रीयलटाइम ट्रिक्स के लिए मैं TypeConverter वर्ग का उपयोग कर रहा हूं ।


0

आप निम्न कंस्ट्रक्टर का उपयोग कर सकते हैं। जब आपके पास C # कोड में दशमलव शाब्दिक होता है, तो C # कंपाइलर इस कंस्ट्रक्टर को कॉल करता है।

Decimal(Int32, Int32, Int32, Boolean, Byte)

संपादित करें: मुझे पता है कि यह सुविधाजनक नहीं है।


2
अगर यह एक विशेषता में काम करता है, तो मैं "एम" प्रत्यय का उपयोग करके भी अनुमान लगा रहा हूं, लेकिन न तो करता है (सिस्टम का उपयोग कर रहा है
।ComponentModel.DefaultValueAttribute
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.