2010-09-29 19 views
8

पर अंतर्निहित ऑपरेटर क्या निम्नलिखित की तरह एक अंतर्निहित ऑपरेटर का उपयोग के साथ कुछ गलत है:सामान्य प्रकार

//linqpad c# program example 
void Main() 
{ 
    var testObject = new MyClass<int>() { Value = 1 }; 

    var add = 10 + testObject; //implicit conversion to int here 
    add.Dump(); // 11 
} 

class MyClass<T> 
{ 
    public T Value { get; set; } 
    public static implicit operator T (MyClass<T> myClassToConvert) 
    { 
     return myClassToConvert.Value; 
    } 
} 

मैं सोच रहा था मैं एक मूल्य के प्रकार के रूप में वस्तु इस तरह के उदाहरण के रूप में इलाज कर सकता है, लेकिन मैं के रूप में देख रहा है मैंने कभी इसका एक उदाहरण नहीं देखा है, मैंने सोचा था कि शायद कोई ऐसा कारण नहीं था जिससे कोई बता सके?

मेरे वास्तविक कोड में मैं डेटा एब्स्ट्रक्शन लेयर के हिस्से के रूप में ऐसा करने की सोच रहा था, ताकि मैं अंतर्निहित डेटा का वर्णन करने वाली जानकारी के साथ वस्तुओं को वापस कर सकूं, लेकिन तर्क कोड को इसे मान प्रकार के रूप में मानने की अनुमति दें, जब यह सब इसके बारे में जानने की जरूरत है मूल्य है, और साथ ही यह सब अच्छा रखो और जेनेरिक के साथ सुरक्षित टाइप करें।

उत्तर

10

निम्न में से सभी सही हैं तो:

  • सभी संभव अपने MyClass<T> प्रकार के मूल्यों (null सहित अगर यह एक मान प्रकार नहीं है!) T

  • की कोई मान्य मान के लिए मानचित्र

    निहित ऑपरेटर कभी नहीं फेंकता (null के लिए भी नहीं!)

  • निहित सह विचलन अर्थपूर्ण भावना बनाता है और क्लाइंट प्रोग्रामर को भ्रमित नहीं कर रहा है

तब इसमें कुछ भी गलत नहीं है। बेशक आप इन तीनों में से कोई भी काम कर सकते हैं, लेकिन यह खराब डिज़ाइन होगा। विशेष रूप से, फेंकता हुआ एक निहित ऑपरेटर डीबग करना बहुत मुश्किल हो सकता है क्योंकि जिस स्थान पर इसे कहा जाता है वह यह नहीं कहता कि इसे कहा जा रहा है।

उदाहरण के लिए, T? पर T पर कोई अंतर्निहित रूपांतरण नहीं है (जहां T, निश्चित रूप से एक मान प्रकार है)। अगर ऐसा कोई निहित ऑपरेटर था, तो T? शून्य होने पर इसे फेंकना होगा, क्योंकि null को परिवर्तित करने के लिए कोई स्पष्ट मूल्य नहीं है, जिससे मान प्रकार T के लिए समझदारी होगी।


जहां मैं मुसीबत था एक मुद्दा जहां अंतर्निहित ऑपरेटर फेंक दिया डिबगिंग मुझे एक उदाहरण देता हूँ: यहाँ

public string Foo() 
{ 
    return some_condition ? GetSomething() : null; 
} 

, GetSomething एक प्रकार मैंने लिखा है जो एक उपयोगकर्ता परिभाषित अंतर्निहित रूपांतरण है के बारे में कुछ लौटे string पर। मैंने बिल्कुल सुनिश्चित किया है कि GetSomething कभी भी null वापस नहीं लौटा सकता, और फिर भी मुझे NullReferenceException मिला! क्यूं कर? उपरोक्त कोड नहीं बराबर

return some_condition ? (string)GetSomething() : (string)null; 

को

लेकिन करने के लिए

return (string)(some_condition ? GetSomething() : (Something)null); 

अब आप देख सकते हैं जहां null से आया है!

+0

मुझे यकीन है कि मैं नल प्रकार चारों ओर चिंता को समझते हैं नहीं कर रहा हूँ ... मुझे ऐसा लगता है कि आप एन = नए MyClass () {मान = अशक्त} था; और उपभोग करने वाले कोड ने int i = n जैसे कुछ करने का प्रयास किया; और यह वही अपवाद फेंक देगा कि कोई भी बुरा कलाकार, यहां शून्य तरीके के बारे में कुछ खास नहीं होगा? – asawyer

+0

@asawyer: यह सिर्फ एक उदाहरण था। कल्पना कीजिए कि वहां कोई टी नहीं था? और * आपको * को अपने 'शून्य' 'को लागू करना था। क्या आप इसे 'टी' में एक अंतर्निहित रूपांतरण देंगे? मेरा जवाब बताता है कि आपको क्यों नहीं करना चाहिए, और क्यों * वास्तविक * 'टी? 'नहीं। – Timwi

+0

अब मैं देखता हूं, यह इस तरह की चिंताओं है जिसने सवाल को पहले स्थान पर पहुंचाया। ऐसा लगता है कि मुझे प्रक्रिया करने के लिए ठीक होना चाहिए, लेकिन बहुत सावधान रहना चाहिए। – asawyer

1

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

Implicit conversion without assignment?

+0

यह सच नहीं है। – Timwi

+0

@ तिमवी, क्या आप निश्चित हैं? 'MyClass myClass', इस बिंदु पर, 'myClass। *' केवल 'MyClass ' पर सदस्यों को हल करेगा, न कि' टी' पर। आपको एरोटीबीर के उल्लेखों के रूप में करना होगा, और 'टी (i) पर किसी भी सदस्य तक पहुंचने के लिए '((टी) myClass) * * करें। –

+0

मैंने कुछ दिन पहले इस सवाल से पूछा था। http://stackoverflow.com/questions/3703555/implicit-conversion-without-assignment – arootbeer

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