Bu C # 7.3 (Çerçeve 4.8) 'de doğru bir şekilde derler:
(string, string) s = ("a", "b");
(object, string) o = s;
Bunun aşağıdakiler için sözdizimsel şeker olduğunu biliyorum, bu da doğru bir şekilde derleniyor:
ValueTuple<string, string> s = new ValueTuple<string, string>("a", "b");
ValueTuple<object, string> o = s;
Yani, ValueTuples kovaryant olarak atanabilir gibi görünüyor , bu harika !
Ne yazık ki, neden anlamıyorum : C # sadece arayüzler ve delegeler üzerinde kovaryansı desteklediği izlenimi altındaydı . ValueType
Ne de.
Aslında, bu özelliği kendi kodumla çoğaltmaya çalıştığımda başarısız oluyorum:
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>'
Öyleyse, neden ValueTuple
s kovaryant olarak atanabilir, ancak MyValueTuple
s olamaz?
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(); }
atamayı yapılandırarak ekleyin . Ayrıca, bu arada harika bir soru!
null
bir karşıNullable<T>
bir yapı olmasına rağmen.