यह 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नहीं कर सकते?
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 है।