2015-08-05 12 views
6

मैंने कोड नीचे लिखा है और यह सफलतापूर्वक संकलित है।क्या मैं एनम के लिए कन्स्ट्रक्टर बना सकता हूं?

class Program 
{ 
     enum Fruits 
     { 
      Apple, 
      Mango, 
      Banana 
     } 

     static void Main(string[] args) 
     { 
      Fruits f = new Fruits(); 
     } 
} 

Fruits के बावजूद किया जा रहा एक enum, संकलक और दुभाषिया मुझे इस लिखने के लिए अनुमति दे रहे हैं। क्या इसका मतलब है कि मैं एक enum के लिए एक निर्माता बना सकते हैं? यदि हां तो कैसे?

+1

आप ऐसे निर्माता के साथ क्या करना चाहते हैं? –

+1

मैं डिफ़ॉल्ट रूप से ऐप्पल लौटने के अपने डिफ़ॉल्ट व्यवहार को ओवरराइड करना चाहता हूं, बस जोर से सोच रहा हूं। – yogi

+0

एनम विकल्प सूचीबद्ध किए गए क्रम को बदलकर आप डिफ़ॉल्ट रूप से बदल सकते हैं। –

उत्तर

4

नहीं, आप नहीं कर सकते।

new Fruits() डिफ़ॉल्ट मान (मूल्य enum के अंतर्निहित प्रकार में 0 से सम्बंधित) वापस आ जाएगी, यह (अपने मामले में या Fruits.Apple) default(Fruits) तरह ही है।

रेमेबर कि enums केवल एक आदिम प्रकार के आसपास रैपर हैं (डिफ़ॉल्ट रूप से int)। आप new Fruits() से new int() पर काफी अधिक तुलना कर सकते हैं। के रूप में यह सिर्फ 0 या default(T) लिखने के लिए और अधिक आम है

आमतौर पर आप new Fruits()/new int() सिंटैक्स का उपयोग नहीं है, लेकिन आप सामान्य कोड में इसका इस्तेमाल कर सकते हैं।

public T NewInstance<T>() 
    where T : new() 
{ 
    return new T(); 
} 

आप NewInstance<Fruits>() कॉल करने के लिए अनुमति दी जाती है, जो Fruits.Apple वापस आ जाएगी: एक उदाहरण के रूप।

+0

जेनिक्स से पहले, एनईटी 1.0 में 'int' –

+1

' int() 'में सिंटैक्टिक शुगर। यह एक फायदा है, लेकिन एक कारण नहीं है। –

+0

@ जोन आपके इनपुट के लिए धन्यवाद, मैं पूरी तरह से .NET 1.0 भूल गया। मैंने जवाब दोहराया। –

1

नहीं। आईएल आउटपुट (LINQPad में जेनरेट) देखें। यह वास्तव में एक कन्स्ट्रक्टर को बिल्कुल नहीं बुला रहा है। इसके बजाए, यह f नामक स्थानीय चर के अंदर पूर्णांक मान 0 संग्रहीत कर रहा है। यह सटीक उसी आउटपुट है जैसा कि आप enum में टाइप प्रकार का उपयोग करते समय प्राप्त करते हैं।

जहां तक ​​संकलक का संबंध है, Fruits f = new Fruits();Fruit f = (Fruit)0; जैसा ही है।

Fruits f = new Fruits() आईएल

Program.Main: 
IL_0000: nop   
IL_0001: ldc.i4.0  
IL_0002: stloc.0  // f 
IL_0003: ret   

Program..ctor: 
IL_0000: ldarg.0  
IL_0001: call  System.Object..ctor 
IL_0006: ret 

तुलना के लिए, यहाँ एक सामान्य वर्ग के आईएल उत्पादन है। कार्यक्रम के तहत IL_001 देखें। मुख्य जहां यह वास्तव में कक्षा के लिए एक कन्स्ट्रक्टर कहता है।

Program.Main: 
IL_0000: nop   
IL_0001: newobj  UserQuery+Program+Fruits..ctor 
IL_0006: stloc.0  // f 
IL_0007: ret   

Program..ctor: 
IL_0000: ldarg.0  
IL_0001: call  System.Object..ctor 
IL_0006: ret   

Fruits..ctor: 
IL_0000: ldarg.0  
IL_0001: call  System.Object..ctor 
IL_0006: ret   
3

C# Spec:

एक enum प्रकार नामित स्थिरांकों का एक सेट के साथ एक अलग मूल्य प्रकार है।

डिफ़ॉल्ट मान (अन्य जवाब में समझाया गया है) के रूप में:

किसी भी enum प्रकार का डिफ़ॉल्ट मान अभिन्न मान शून्य enum प्रकार में बदल जाती है। ऐसे मामलों में जहां चर स्वचालित रूप से डिफ़ॉल्ट मान के लिए प्रारंभ होते हैं, यह मान enm प्रकारों के चर के लिए दिया गया मान है। एनम प्रकार के डिफ़ॉल्ट मान को आसानी से उपलब्ध होने के लिए, शाब्दिक 0 निहित रूप से किसी भी enum प्रकार में परिवर्तित हो जाता है।

डिफ़ॉल्ट निरंतर अपने enum में पहला स्थानांतरित करें।

1

किसी भी मूल्य प्रकार के लिए, एक पैरामीटर रहित कन्स्ट्रक्टर है जो सभी शून्य मान देता है। इसलिए:

var val = new int(); // 0 
var val = new double(); // 0.0 
var val = new DateTime(); // 0001-01-01T00:00:00.000000 Unspecified timezone 
var val = new StringSplitOptions(); // StringSplitOptions.None 

हालांकि:

  1. आप नहीं एक नया निर्माता एक प्रकार है कि एक struct या एक class नहीं है के लिए इतनी के रूप में जहाँ तक मूल्य-प्रकार जाना है, केवल struct जोड़ सकते हैं, और।
  2. आप इनमें से किसी भी डिफ़ॉल्ट निर्माता का कार्यान्वयन नहीं बदल सकते हैं।

enum एस और प्राइमेटिव के मामले में निर्माता को भी घोषित नहीं किया गया है।

इसलिए आप ऐसे निर्माता नहीं बना सकते हैं।

(कड़ाई से बोलते हुए, .NET आपको struct पर परिभाषित पैरामीटर रहित कन्स्ट्रक्टर सेट करने की अनुमति देता है लेकिन सी # नहीं करता है, और यदि आप इसे कच्चे सीआईएल में करते हैं तो असंगत नियम हैं जब इसे कॉल किया जाएगा और जब आप बस एक सर्व-शून्य उदाहरण बनाया जाएगा)।

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

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