क्यों "दशमलव" एक मान्य विशेषता पैरामीटर प्रकार नहीं है?


139

यह वास्तव में अविश्वसनीय लेकिन वास्तविक है। यह कोड काम नहीं करेगा:

[AttributeUsage(AttributeTargets.Property|AttributeTargets.Field)]
public class Range : Attribute
{
    public decimal Max { get; set; }
    public decimal Min { get; set; }
}

public class Item
{
    [Range(Min=0m,Max=1000m)]  //compile error:'Min' is not a valid named attribute argument because it is not a valid attribute parameter type 
    public decimal Total { get; set; }  
}

जबकि यह काम करता है:

[AttributeUsage(AttributeTargets.Property|AttributeTargets.Field)]
public class Range : Attribute
{
    public double Max { get; set; }
    public double Min { get; set; }
}

public class Item
{
    [Range(Min=0d,Max=1000d)]
    public decimal Total { get; set; }  
}

कौन मुझे बता सकता है कि दशमलव क्यों नहीं है, जबकि डबल ठीक है।


जवाबों:


139

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

JaredPar के इस जवाब से लिया गया ।

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


35
सीएलआर में दशमलव को आदिम प्रकार क्यों नहीं माना जाता है?
कौमाइड्स

10
@koumides का मानना ​​है कि उत्तर एक सीपीयू रजिस्टर में व्यक्त करने के लिए टाइप बहुत बड़ा है क्योंकि यह 128 बिट है
क्रिस मैरिसिक

2
ठीक है तो विशेषता गुणों के रूप में तार की अनुमति क्यों है? मुझे लगता है कि यह 'प्राथमिकताओं की श्रेणी' के अंतर्गत आता है, लेकिन यह आवंटित किया गया है (संदर्भ प्रकार) ...
Steztric

क्योंकि तार संदर्भ प्रकार हैं जो पूरी तरह से अलग होते हैं।
कार्स्टन शुट्टे

2
@ यह सच नहीं है, Enumसमर्थित हैं। वर्तमान में मेरे पास 2 कस्टम विशेषताएँ हैं जिनमें से 2 एनुम के साथ हैं और अन्य में एनाम की एक सरणी है।
फ़्रैंक

60

से चश्मा :

विशेषता वर्ग के लिए स्थितीय और नामित पैरामीटर के प्रकार विशेषता पैरामीटर प्रकारों तक सीमित हैं, जो हैं:

  • निम्नलिखित प्रकार से एक: bool, byte, char, double, float, int, long, sbyte, short, string, uint, ulong, ushort
  • प्रकार object
  • प्रकार System.Type
  • एक एनुम प्रकार, बशर्ते इसकी सार्वजनिक पहुंच हो और इसके प्रकार नस्ट (यदि कोई हों) भी सार्वजनिक पहुंच (एट्रीब्यूट विनिर्देश) हैं।
  • उपरोक्त प्रकार के एकल-आयामी सरणियाँ।

10
सही, लेकिन ध्यान दें कि आप कल्पना के पुराने संस्करण को उद्धृत कर रहे हैं। सी # संस्करण 3.0, 4.0, और 5.0 में, यह कहा गया है यह भी प्रकार हो सकता है कि sbyte, ushort, uint, ulong। और यह सब ठीक काम करने लगता है। लेकिन अभी भी decimalअनुमति नहीं है :-(
जेपी स्टिग नीलसन

1
@JeppeStigNielsen मैंने विशेष लिंक और बोली अपडेट की है
Ohad Schneider

6
अशक्त आदिम भी समर्थित नहीं हैं।
केटीओ

2

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

public String MinimumValue
{
    get
    {
        return minimumValueDecimal.ToString();
    }

    set
    {
        minimumValueDecimal = Decimal.Parse(value);
    }
}

private decimal minimumValueDecimal;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.