2009-04-29 15 views
15

सी # 4.0 कॉन्वर्सिस और contravariance का समर्थन करने जा रहा है। लेकिन मैं इस नई सुविधा के लाभों को स्पष्ट रूप से समझ नहीं पा रहा हूं। क्या आप मुझे समझा सकते हैं (स्पष्ट रूप से) हमें इसकी आवश्यकता क्यों है?कॉन्वर्सिस और contravariance के क्या फायदे हैं?

+0

[कोविरिएंस बनाम contravariance] (http://izlooite.blogspot.com/2011/04/covariance-and-contravariance.html) –

+0

बार्ट डी स्मेट में कॉन्वर्सिस और contravariance के बारे में एक महान ब्लॉग प्रविष्टि है [http] (http: //bartdesmet.net/blogs/bart/archive/2009/04/13/c-4-0-feature-focus-part-4-generic-co-and-contra-variance-for-delegate-and-interface- types.aspx)। –

उत्तर

7

वे आपको कुछ ऐसी चीजें करने की अनुमति देते हैं जो अवधारणात्मक रूप से मान्य हैं, और औपचारिक रूप से स्वीकार्य हैं, लेकिन वर्तमान में भाषा की बाधाओं के कारण अनुमति नहीं है। उदाहरण के लिए:

IEnumerable<int> ints = new List<int> { 1, 2, 3 }; 

Action<IEnumerable<object>> PrintThings = 
    x => { foreach(var thing in x) Console.WriteLine(thing); }; 

PrintThings(ints); // doesn't compile right now :( will compile in 4.0 

कोई मौलिक कारण नहीं है कि यह काम नहीं कर सकता है या काम नहीं करना चाहिए; यह भाषा में अनुमति नहीं है। इसे अनुमति देकर, आप प्रोग्रामर के जीवन को आसान बनाते हैं जब ऐसा ऑपरेशन उनके लिए प्राकृतिक होगा।

+0

उपरोक्त मौलिक कारण 4.0 से पहले काम नहीं करेगा यह है कि वाक्य सुरक्षा को खोए बिना इसे अनुमति देने के लिए सिंटैक्स में कोई रास्ता नहीं है। यदि आप इसे अपने उदाहरण के लिए अनुमति देते हैं, तो आप जरूरी रूप से उन उदाहरणों के लिए अनुमति दें जहां सुरक्षा सुरक्षा संरक्षित नहीं है। – Eddie

+0

यह सही है, इसीलिए वे इस परिदृश्य को अनुमति देने के लिए नए "इन" और "आउट" कीवर्ड जोड़ रहे हैं (और IENumerable होगा।) – mquander

1

इस मुद्दे के बारे में बात करते हुए एक अच्छा लिखना है here

5

4.0 में कैसे और कैसे काम करेगा इस बारे में गलत धारणाएं हैं। अब तक मैंने जो सबसे अच्छा स्पष्टीकरण पढ़ा है वह मेरी मार्क ग्रेवेल लिखा गया था।

http://marcgravell.blogspot.com/2009/02/what-c-40-covariance-doesn-do.html

बस दोहराते हैं, ppl की बहुत लगता है कि यह 4.0 में काम करेंगे: यहाँ अपने ब्लॉग पोस्ट देखें कुछ अन्य वर्ग

List<Derived> derived.... 

public void Method(List<Base> b){} 

..in

public class Base{} 
public class Derived : Base {} 

4.0 में भी, आप इस विधि में सूची को पास करने में सक्षम नहीं होंगे। मार्क बताते हैं, कि क्या सामान्य बाधाओं के लिए कर रहे हैं, और के बाद से 2.0

+0

यह मेरे लिए एक अजीब गैर अनुक्रमक जैसा प्रतीत होता है। सूची को पारित करने का एकमात्र कारण यह नहीं है क्योंकि सूचियां उत्परिवर्तनीय हैं; बेशक आप इस तरह से गुजर नहीं सकते हैं, क्योंकि इसमें आइटम जोड़ने से इस प्रकार के प्रकार के प्रतिबंध टूट जाएंगे। – mquander

+0

@mquander: एक अजीब गैर अनुक्रमक? एपीआई (प्री 4.0) में कुछ भी कहना नहीं है, "यदि आप ऑब्जेक्ट अपरिवर्तनीय हैं तो आप केवल यह ऑपरेशन कर सकते हैं"। – Eddie

+0

मेरा मुद्दा यह है कि तथ्य यह है कि सूची आपको टीएस जोड़ने और बदलने की अनुमति देती है, इसलिए यह समझ में नहीं आता है। यदि आपने इसे अनुमति देने के लिए IList पर "आउट" पैरामीटर जोड़ने का प्रयास किया है, तो वे विधियां अब इरादे से काम नहीं कर सकती हैं। – mquander

2

लाभ है कि, मेरी राय में, सहप्रसरण मदद करने के लिए एक बहुत जेनेरिक्स साथ है जा रहा है में से एक किया जा सकता है है।

मुझे कई स्थितियों का सामना करना पड़ा जहां किसी को स्पष्ट रूप से Cast से को इसके आधार पर एक विशिष्ट प्रकार का रूपांतरित करने की आवश्यकता है।

class Foo { } 
class Bar : Foo { } 

// ... 

IEnumerable<Foo> foos = new List<Foo>(); 
IEnumerable<Bar> bars = new List<Bar>(); 

foos = bars.Cast<Foo>(); 

// C# 4.0 
foos = bars; 

इस विषय पर good reference है।

+0

फिर भी, इटालिक्स का अत्यधिक उपयोग एक अच्छा स्पर्श था। – bzlm

+0

क्षमा करें :(कक्षा डीफ़ भूल गए –

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