2012-02-10 2 views
5

तो अगर वहाँ एक class, मैं क्यों enum संपत्ति या इस स्थिति में type<T> के किसी भी static संपत्ति उपयोग नहीं कर सकते Bar कहा जाता है में एक enum संपत्ति है। मैं स्पष्ट रूप से घोषणा कर रहा हूं कि <T>typeBar है। बस जानना चाहता था कि क्या यह जेनरिक की सीमा है या enumtype स्वयं ही है।से जेनेरिक संदर्भ प्रकार एक Enum या स्टेटिक संपत्ति हो रही <T>

public class Foo<T> where T : Bar 
{ 
    public Foo() 
    { 
     // This obviously works 
     var car = Bar.Cars.Honda; 
     var name = Bar.Name; 

     // Why can't I do this ? 
     var car2 = T.Cars.Toyota; 
     var name2 = T.Name; 
    } 
} 

public class Bar 
{ 
    public static string Name { get; set; } 
    public enum Cars 
    { 
     Honda, 
     Toyota 
    }; 
} 

UPDATED @Frederik Gheysels के जवाब में, यह उल्लेख किया गया है कि अगर मैं एक class कि बस Bar से ली गई है है कि मैं enum या के किसी भी static के लिए पहुँच नहीं होगा base। यह सही नहीं है, यह संकलित करता है और काम करता है।

public class Foo : Bar 
{ 
    public Foo() 
    { 
     // This all works 
     var address = this.Address; 
     var car = Foo.Cars.Honda; 
     var name = Foo.Name; 
    } 
} 

public class Bar 
{ 
    public static string Name { get; set; } 
    public string Address { get; set; } 
    public enum Cars 
    { 
     Honda, 
     Toyota 
    } 
} 
+4

आप * ऐसा क्यों करने में सक्षम होना चाहते हैं? यहां उपयोग का मामला क्या है? –

+0

http://stackoverflow.com/questions/196661/calling-a-static-method-on-a-generic-type-parameter – AlG

+0

जैसा ही आप [इस] (http: // stackoverflow) के समान कुछ पूरा करने की कोशिश कर रहे हैं .com/प्रश्न/4704201/क्या-है-सबसे अच्छा तरह से करने के लिए ओवरराइड-enums)? –

उत्तर

1

अपने Cars enum, वर्ग Bar अंदर एक नेस्टेड प्रकार है। यह Bar की सदस्य संपत्ति/विधि नहीं है। इसलिए, यह संभव नहीं है।

कारें सिर्फ घोंसला वाला प्रकार है। जब आप बार से प्राप्त एक और कक्षा बनाते हैं, तो इसे Bar2 पर कॉल करें, आपको Bar2.Cars तक पहुंच नहीं होगी, क्योंकि उस प्रकार का निर्माण नहीं किया जाएगा। नेस्टेड प्रकार उदाहरण के सदस्य नहीं हैं, और इस प्रकार विरासत में नहीं हैं।

+1

यह सवाल का जवाब नहीं देता है कि यह क्यों संभव नहीं है। –

+4

यह * बार का सदस्य है - एक प्रकार एक प्रकार का सदस्य है। –

+2

हां, लेकिन बार के लिए विशिष्ट। एक विरासत प्रकार का बार, जिसे टी के जेनेरिक पैरामीटर के रूप में अनुमति दी जाएगी, में <विरासत प्रकार> कार प्रकार नहीं होगा। –

1

स्थिर सदस्यों का पर्दाफाश करने के लिए Bar से प्राप्त करने के लिए Foo<T> को अनुमति देने के लिए एक संभावित कार्यवाही है। स्थिर सदस्य Name तक पहुंचने के लिए, आपको वर्चुअल एक्सेसर को discussed here के रूप में प्रदान करने की आवश्यकता है।

public class Foo<T> : Bar where T : Bar 
{ 
    public Foo() 
    { 
     // This obviously works 
     var car = Bar.Cars.Honda; 
     var name = Bar.Name; 

     // use base class for enum accessor ? 
     var car2 = Foo<T>.Cars.Toyota; 
     var name2 = Foo<T>.Name; 

     default(T).Accessor = "test"; // static member access 
    } 
} 

public class Bar 
{ 
    public static string Name { get; set; } 
    public enum Cars { Honda, Toyota }; 
    public virtual string Accessor 
    { 
     get { return Name; } 
     set { Name = value; } 
    } 
} 
+0

लेकिन 'फू' 'बार' नहीं हो सकता है। यदि आप किसी संग्रह प्रकार जेनेरिक पर विचार करते हैं तो यह संभवतः नहीं है। –

संबंधित मुद्दे