Esto se compila correctamente en C # 7.3 (Framework 4.8):
(string, string) s = ("a", "b");
(object, string) o = s;
Sé que esto es azúcar sintáctico para lo siguiente, que también se compila correctamente:
ValueTuple<string, string> s = new ValueTuple<string, string>("a", "b");
ValueTuple<object, string> o = s;
Por lo tanto, parece que ValueTuples se puede asignar covariantly , que es impresionante !
Desafortunadamente, no entiendo por qué : tenía la impresión de que C # solo admitía la covarianza en interfaces y delegados . ValueTypeEs ninguno.
De hecho, cuando trato de duplicar esta función con mi propio código, fallo:
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>'
Entonces, ¿por qué se ValueTuplepueden asignar s covariablemente, pero MyValueTupleno se pueden asignar s?
c#
covariance
valuetuple
Heinzi
fuente
fuente

nulla unNullable<T>archivo aunque sea una estructura.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(); }su deconstrucción de la asignación. Además, una gran pregunta por cierto!Respuestas:
Creo que lo que realmente está sucediendo aquí es una tarea de desestructuración. Asignación de tuplas tratará de convertir implícitamente sus componentes, y como es posible asignar
stringaobject, que es lo que sucede aquí.Fuente
Véalo en sharplab.io
fuente
spara escribirlo,(string, object)se produce un error de conversión, lo que indica que se está produciendo una conversión implícita entre los elementos y que la cadena se puede convertir implícitamente en cadena, pero no al revés.