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 . ValueType
Es 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 ValueTuple
pueden asignar s covariablemente, pero MyValueTuple
no se pueden asignar s?
c#
covariance
valuetuple
Heinzi
fuente
fuente
null
a 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
string
aobject
, que es lo que sucede aquí.Fuente
Véalo en sharplab.io
fuente
s
para 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.