2009-09-12 9 views
20

यदि मैं यहटी के समय एक वैध कस्टम विशेषता पैरामीटर नहीं है जब एक Nullable <T> क्यों है?

public enum Hungry 
{ 
    Somewhat, 
    Very, 
    CouldEatMySocks 
} 

की तरह एक enum और इस

public class HungerAttribute : Attribute 
{ 
    public Hungry HungerLevel { get; set; } 
    public Hungry? NullableHungerLevel { get; set; } 
} 

की तरह एक कस्टम विशेषता है कि मैं इस

[Hunger(HungerLevel = Hungry.CouldEatMySocks)] 
public class Thing1 

कर सकते हैं, लेकिन मैं इस

ऐसा नहीं कर सकते
[Hunger(NullableHungerLevel = Hungry.CouldEatMySocks)] 
public class Thing2 

यह एक त्रुटि उत्पन्न करता है जो कहता है "'NullableHungerLevel' मान्य नाम विशेषता तर्क नहीं है क्योंकि यह मान्य विशेषता पैरामीटर प्रकार नहीं है"।

इसकी अनुमति क्यों नहीं है? मैं समझता हूं कि मूल रूप से यह स्वीकार्य प्रकारों की सूची पर नहीं है। मान्य प्रकार प्राइमेटिव, एनम्स, स्ट्रिंग, टाइप, और पिछले प्रकार के एक आयामी सरणी प्रतीत होते हैं।

क्या यह एक पुराना नियम है जिसे न्यूलबल के साथ आने पर अपडेट नहीं किया गया था?

class Program 
{ 
    [Hunger()] 
    static void Main(string[] args) 
    { 
    } 

    public sealed class HungerAttribute : Attribute 
    { 
    private readonly Hungry? _HungerLevel; 
    public Hungry? HungerLevel { get { return _HungerLevel; } } 

    public bool IsNull { get { return !_HungerLevel.HasValue; } }   

    public HungerAttribute() 
    { 
    } 

    //Or: 
    public HungerAttribute(Hungry level) 
    { 
     _HungerLevel = level; 
    } 
    } 

    public enum Hungry { Somewhat, Very, CouldEatMySocks } 
} 

मैं समझता हूँ कि तुम दोनों गुणों का उपयोग करने के लिए नहीं जा रहे हैं:

+1

के लिए जाँच करने के लिए जब मैं मूल रूप में यह .NET 3.5 VS2008 यह अभी भी भर आया वीएस -2010 बीटा 1 में काम नहीं करता है। –

उत्तर

26

भूख? < भूख > है, जो मामले में मतलब है कि

[Hunger(NullableHungerLevel = Hungry.CouldEatMySocks)] 

[Hunger(NullableHungerLevel = new Nullable<Hungry>(Hungry.CouldEatMySocks))] 

के बराबर है जब से तुम केवल नामित विशेषता तर्क में स्थिर मान का उपयोग कर सकते हैं प्रकार का नृत्य के समाधान का सहारा लेना होगा नल के बराबर है।

+0

अब आप इसे समझाते हैं यह स्पष्ट है! धन्यवाद –

19

अपने गुण में एक और प्रारंभकर्ता बनाने यह चारों ओर पाने के लिए।

+0

सवाल यह नहीं था कि "मैं यह कैसे करूं", सवाल "क्यों" था।यह किसी भी तरह से जवाब क्यों देता है। –

+0

हां। यह काम करता है। मुझे पता है कि इसके आसपास कैसे जाना है, लेकिन मुझे परेशान है कि यह नामित पैरामीटर के रूप में क्यों काम नहीं करता है। यह मेरे लिए असंगत लगता है। –

+0

क्या मुझे यह जवाब हटा देना चाहिए? दुर्भाग्यवश मुझे भाग्य पर कोई जवाब नहीं मिला है :( – Shimmy

5

गुणों में केवल पैरामीटर प्राइमेटिव्स, टाइपोफ एक्सप्रेशन और सर-सृजन अभिव्यक्ति के रूप में हो सकता है।

Nullable एक संरचना है।

इसलिए इसकी अनुमति नहीं है।

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

मुझे इसे बदलने की कोई योजना नहीं है। लेकिन मैं यह नहीं समझा सकता कि यह प्रतिबंध क्यों मौजूद है।

1

नामुमकिन enum बनाने के बजाय, आप उस enum के लिए डिफ़ॉल्ट मान बना सकते हैं। 1 मूल्य से Enum पिकअप डिफ़ॉल्ट, तो यह

public enum Hungry 
{ 
    None, 
    Somewhat, 
    Very, 
    CouldEatMySocks 
} 
अपने कोड में

की तरह अपने enum सेट आप ऐसा कर सकता है अशक्त

if(default(Hungry) == HungerLevel)//no value has been set 
संबंधित मुद्दे