Cela se compile correctement en C # 7.3 (Framework 4.8):
(string, string) s = ("a", "b");
(object, string) o = s;
Je sais que c'est du sucre syntaxique pour les éléments suivants, qui se compile également correctement:
ValueTuple<string, string> s = new ValueTuple<string, string>("a", "b");
ValueTuple<object, string> o = s;
Il semble donc que les ValueTuples puissent être attribués de manière covariante , ce qui est génial !
Malheureusement, je ne comprends pas pourquoi : j'avais l'impression que C # ne supportait que la covariance sur les interfaces et les délégués . ValueType
est ni.
En fait, lorsque j'essaie de dupliquer cette fonctionnalité avec mon propre code, j'échoue:
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>'
Alors, pourquoi peut- ValueTuple
on attribuer s de façon covariante, mais MyValueTuple
pas?
c#
covariance
valuetuple
Heinzi
la source
la source
null
à unNullable<T>
même s'il s'agit d'une structure.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(); }
pour déconstruire l'affectation. Aussi, bonne question d'ailleurs!Réponses:
Je crois que ce qui se passe ici est une mission de déstructuration. Cession tuple tentera de convertir implicitement ses composants, et comme il est possible d'assigner
string
àobject
, qui est ce qui se passe ici.La source
Voir sur sharplab.io
la source
s
de type,(string, object)
cela entraîne une erreur de conversion, indiquant qu'une conversion implicite a lieu entre les éléments, et la chaîne peut être implicitement convertie en chaîne, mais pas l'inverse.