2010-10-20 12 views
8

इस प्रकार है:क्या क्लास प्रॉपर्टी/फील्ड अज्ञात प्रकार का हो सकता है सी # 4.0 में?

public class MyClass { 

    private static var MyProp = new {item1 = "a", item2 = "b"}; 

} 

नोट: उपर्युक्त संकलन नहीं करता है और न ही काम करता है (var का उपयोग नहीं किया जा सकता है), यह केवल मेरा बिंदु दिखाने के लिए है।

अद्यतन: बस प्रश्न को स्पष्ट करने के लिए, मैंने पहले से ही

private static dynamic MyProp = new {item1 = "a", item2 = "b"}; 

का उपयोग करने का प्रयास किया था और यह काम करता है, लेकिन यह डायनामिक टाइपिंग के कारण इंटेलिजेंस उत्पन्न नहीं करता है। मुझे पता है कि अनाम टाइपिंग सिर्फ एक कंपाइलर चाल है, इसलिए मुझे आशा थी कि मैं पहले से ही एक वर्ग घोषित किए बिना संरचित क्षेत्र घोषित करके इस लाभ का उपयोग अपने लाभ के लिए कर सकता हूं (मुख्य रूप से क्योंकि इस विशेष प्रकार के केवल एक उदाहरण होने जा रहा है खेत)। अब मैं देख सकता हूं कि यह संभव नहीं है, लेकिन मुझे यकीन नहीं है कि ऐसा क्यों है। यदि संकलक किसी अज्ञात ऑब्जेक्ट के लिए केवल एक अंतर्निहित प्रकार उत्पन्न कर रहा है, तो यह कंपाइलर को इस क्षेत्र के लिए इस अंतर्निहित प्रकार को उत्पन्न करने के लिए काफी सरल होना चाहिए।

+1

'MyProp' नहीं एक संपत्ति है, यह है एक क्षेत्र – Greg

+0

@ ग्रेग: वहां, मैंने इसे डिएगो (और आप) के लिए तय किया: पी –

+0

@ एंड्रयू - मुझे बहुत राहत मिली है, धन्यवाद! – Greg

उत्तर

5

नहीं है, किसी भी सदस्य एक जोरदार टाइप किया होना चाहिए।

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

संपादित करें: सदस्यों को स्पष्ट रूप से टाइप किया जाना चाहिए।

+1

var दृढ़ता से टाइप किया गया है। मुझे लगता है कि आप जो कहना चाहते हैं वह "स्पष्ट रूप से टाइप किया गया" है। – MarkPflug

+0

@ मार्क हां, var को कक्षा के लिए सदस्य के रूप में उपयोग नहीं किया जा सकता है। – abhishek

9

ऐसा लगता है जैसे आप एक या दो प्रश्न पूछ सकते हैं, इसलिए मैं उन्हें दोनों कोशिश करूँगा और उन्हें संबोधित करूंगा।

एक वर्ग क्षेत्र दृढ़ता से एक गुमनाम प्रकार

सं बेनामी प्रकार के नाम सी # कोड में कहा गया है नहीं किया जा सकता है (इसलिए अनाम) को टाइप किया जा सकता है। एक ही रास्ता स्थिर उन्हें टाइप करने के लिए

  1. जेनेरिक प्रकार inferencee
  2. var कीवर्ड

इन में से कोई एक प्रकार के क्षेत्र के लिए लागू कर रहे हैं का उपयोग है।

क्या कक्षा फ़ील्ड को अनाम प्रकार अभिव्यक्ति के साथ प्रारंभ किया जा सकता है?

हां। क्षेत्र सिर्फ एक प्रकार गुमनाम प्रकार के साथ संगत करने के लिए घोषित किए जाने की जरूरत: object उदाहरण के लिए

public class MyClass { 
    private static object MyProp = new {item1 = "a", item2 = "b"}; 
} 
+3

एरर के लिए धन्यवाद ... तो उत्तर "हाँ" नहीं है, लेकिन "नहीं"? –

+0

@Adam उत्तर यह प्रश्न अस्पष्ट है :) मैं अपना उत्तर कम करने की कोशिश करूंगा ताकि – JaredPar

+0

हां ... ऑब्जेक्ट और गतिशील दोनों अज्ञात सदस्य नहीं देते हैं। तो जवाब नहीं होना चाहिए। – abhishek

0

नहीं, अज्ञात प्रकारों को उनके घोषित कार्य के बाहर object के अलावा कुछ भी नहीं बताया जा सकता है। जबकि अज्ञात प्रकार केवल वाक्य रचनात्मक चीनी है और वास्तव में, एक ठोस प्रकार बनाते हैं, इस प्रकार डेवलपर को कभी भी ज्ञात नहीं है (न ही उपलब्ध), और इस प्रकार इसका उपयोग नहीं किया जा सकता है।

+2

आप कहते हैं "कभी ज्ञात नहीं" और "उपयोग नहीं किया जा सकता", लेकिन क्या आप प्रतिबिंब और 'गतिशील 'छूट नहीं दे रहे हैं? (ऐसा नहीं है कि मैं इस अभ्यास को प्रोत्साहित कर रहा हूं, आपको दिमाग में रखता हूं।) –

+0

@ एंथनी: नहीं, उनमें से कोई भी डेवलपर (जैसा कि, कोड लिखने वाला व्यक्ति) टाइप करने के लिए अनुमति देता है। आप निश्चित रूप से ऑब्जेक्ट पर 'GetType() 'को कॉल कर सकते हैं, लेकिन यह एक रनटाइम-केवल ऑपरेशन है। न ही 'गतिशील' समाधान है। –

2

यदि यह सी # 4 है, तो गतिशील कीवर्ड देखें।

public class MyClass 
{ 
    private static dynamic MyProp = new {item1 = "a", item2 = "b"}; 
} 

हालांकि, जैसे ही आप ऐसा करते हैं, आप किसी प्रकार की प्रकार-सुरक्षा और आसान कंपाइलर चेक खो देते हैं।

+1

मैंने यही किया, लेकिन मैंने वस्तु के गुणों पर इंटेलिजेंस खो दिया। मैं ऐसा करना चाहता हूं ताकि इंटेलिजेंस मेरी कक्षा का उपयोग करने वाले लोगों की सहायता कर सके। – Diego

2

इसके बजाय Tuple<string, string> का उपयोग करने के बारे में कैसे?

public class MyClass { 

    private static Tuple<string, string> MyProp = Tuple.Create("a", "b"); 

} 
+1

मैं इस सटीक कोड को स्वयं ब्लॉक करने वाला था। स्पष्ट रूप से स्थाई रूप से टाइप किया गया है, और आपको मैन्युअल रूप से एक नया प्रकार बनाने की आवश्यकता नहीं है। मुझे उम्मीद है कि यह उन मूर्ख "गतिशील" समाधानों से पहले उभरा है। – MarkPflug

+0

बेशक, अब आपका जवाब छीन लिया गया था जो शायद असंभव है। – MarkPflug

+0

हे, ओह ठीक है। किसी भी सवाल से यह जरूरी नहीं है कि एक टुपल एक अच्छा समाधान होगा। उदाहरण कोड में केवल "item1" और "item2" फ़ील्ड हैं, लेकिन शायद असली कोड में अधिक तार्किक नाम हैं, जो टुपल का उपयोग करके खो जाएंगे। चूंकि यह एक निजी क्षेत्र है, इसलिए टुपल शायद ठीक है, लेकिन यदि यह एक सार्वजनिक क्षेत्र था तो शायद मैं कहूंगा कि इस डेटा को स्टोर करने के लिए एक विशिष्ट प्रकार को परिभाषित करना बेहतर विचार है, भले ही यह थोड़ा और कोडिंग हो। –

1

का एक संपत्ति (या क्षेत्र) एक नामित वर्ग, एक गुमनाम प्रकार नहीं कर सकते हैं क्योंकि इस तरह के एक प्रकार के कोड में निर्दिष्ट नहीं किया जा सकता। हालांकि, एक गुमनाम प्रकार गुमनाम प्रकार की प्रॉपर्टी हो सकती हैं:

var myObj = new 
{ 
    Foo = new { Name = "Joe", Age = 20 } 
}; 

लेकिन इस तरह के एक निर्माण स्थानीय दायरे से बाहर कोई व्यावहारिक उपयोग है ...

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