यह 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>'
तो, क्यों को ValueTuple
covariantly सौंपा जा सकता है, लेकिन MyValueTuple
नहीं कर सकते?
ValueTuple<object, string> o = new ValueTuple<object, string>(s.Item1, s.Item2);
public static implicit operator MyValueTuple<A, B>(MyValueTuple<string, string> v) { throw new NotImplementedException(); }
असाइन किए गए ऑपरेटर को उसके असाइनमेंट को डिकॉन्स्ट्रक्ट करने के लिए जोड़ें । इसके अलावा, जिस तरह से महान सवाल!
null
एक करने के लिएNullable<T>
भले ही यह एक struct है।