สิ่งนี้รวบรวมได้อย่างถูกต้องใน C # 7.3 (Framework 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
s ไม่สามารถ
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>
แม้ว่ามันจะเป็นโครงสร้าง