क्या करता है ValueTuple सहसंयोजक?


35

यह C # 7.3 (फ्रेमवर्क 4.8) में सही ढंग से संकलित है:

(string, string) s = ("a", "b");
(object, string) o = s;

मुझे पता है कि यह निम्नलिखित के लिए वाक्य रचना चीनी है, जो सही ढंग से संकलित करता है:

ValueTuple<string, string> s = new ValueTuple<string, string>("a", "b");
ValueTuple<object, string> o = s;

तो, ऐसा प्रतीत होता है कि ValueTuples को covariantly सौंपा जा सकता है , जो कि बहुत बढ़िया है !

दुर्भाग्य से, मुझे समझ में नहीं आता है : मैं इस धारणा के तहत था कि C # ने केवल इंटरफेस और डेलीगेट्स पर सहसंयोजक का समर्थन कियाValueTypeनहीं है।

वास्तव में, जब मैं अपने कोड के साथ इस सुविधा को डुप्लिकेट करने का प्रयास करता हूं, तो मैं विफल रहता हूं:

struct MyValueTuple<A, B>
{
    public A Item1;
    public B Item2;

    public MyValueTuple(A item1, B item2)
    {
        Item1 = item1;
        Item2 = item2;
    }
}

...

MyValueTuple<string, string> s = new MyValueTuple<string, string>("a", "b");
MyValueTuple<object, string> o = s;
// ^ Cannot implicitly convert type 'MyValueTuple<string, string>' to 'MyValueTuple<object, string>'

तो, क्यों को ValueTuplecovariantly सौंपा जा सकता है, लेकिन MyValueTupleनहीं कर सकते?


2
यह सिर्फ तुम कैसे प्रदान कर सकते हैं की तरह संकलक द्वारा की संभावना विशेष उपचार, है nullएक करने के लिए Nullable<T>भले ही यह एक struct है।
जुखर

2
वास्तव में, डिकॉम्फ़ेड कोड दूसरे असाइनमेंट के लिए इस तरह दिखता है:ValueTuple<object, string> o = new ValueTuple<object, string>(s.Item1, s.Item2);
लास वी। कार्लसन

2
एक अजीब सीएलआर प्रतिनिधित्व पर निर्भर होने के बजाय, ट्यूपल्स अजीब हैं और पूरी तरह से सी # कंपाइलर फ्रंट एंड में लागू होते हैं। असाइनमेंट ऑपरेटर वह नहीं कर रहा है जो आप सोचते हैं।
जेरेमी लक्ष्मण

2
public static implicit operator MyValueTuple<A, B>(MyValueTuple<string, string> v) { throw new NotImplementedException(); }असाइन किए गए ऑपरेटर को उसके असाइनमेंट को डिकॉन्स्ट्रक्ट करने के लिए जोड़ें । इसके अलावा, जिस तरह से महान सवाल!
14:ö17xěŕ

1
@ @ÖÇxěŕ बैल की आँख! कि यह संकलन योग्य बनाता है, और अपवाद के रूप में फेंक दिया जाता है
मोंग झू

जवाबों:


25

मेरा मानना ​​है कि वास्तव में यहाँ क्या हो रहा है, एक विनाशकारी असाइनमेंट है। टपल असाइनमेंट अपने घटकों को स्पष्ट रूप से परिवर्तित करने का प्रयास करेगा, और जैसा कि यह निर्दिष्ट stringकरना संभव है object, कि यहां क्या होता है।

भाषा टपल प्रकारों के बीच असाइनमेंट का समर्थन करती है जिसमें समान तत्वों की संख्या होती है, जहां प्रत्येक दाएं हाथ के तत्व को कथित रूप से इसके संबंधित बाएं-बाएं साइड तत्व में परिवर्तित किया जा सकता है। असाइनमेंट के लिए अन्य रूपांतरणों पर विचार नहीं किया गया है।

स्रोत

इसे sharplab.io पर देखें


4
मैं सिर्फ SharpLab पर यह कोशिश की और यकीन है कि यह वास्तव में ऐसा करता है
जॉन

3
बस इसे सुदृढ़ करने के लिए, ओपी के मूल उदाहरण में, यदि आप इसे sटाइप करने के लिए परिवर्तित करते हैं, तो (string, object)परिणाम में त्रुटि होती है, यह दर्शाता है कि आइटम के बीच निहित रूपांतरण हो रहा है, और स्ट्रिंग को अंतर्निहित रूप से स्ट्रिंग में परिवर्तित किया जा सकता है, लेकिन इसके विपरीत नहीं।
एरिक लीज
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.