Це складено правильно у 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 можна призначати коваріантно , що приголомшливо !
На жаль, я не розумію, чому : у мене було враження, що 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
призначати коваріантно, а 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>
навіть якщо це структура.