Es posible en C# para sobrecargar un genérico operador de conversión de la siguiente manera?
-
06-07-2019 - |
Pregunta
Sólo me preguntaba si hay de todos modos para representar el siguiente código en C# 3.5:
public struct Foo<T> {
public Foo(T item) {
this.Item = item;
}
public T Item { get; set; }
public static explicit operator Foo<U> ( Foo<T> a )
where U : T {
return new Foo<U>((U)a.Item)
}
}
Gracias
Solución
Los operadores de conversión no pueden ser genéricos. De la sección de especificaciones 10.10, aquí está el formato de un declarador de operador de conversión:
conversion-operator-declarator: implicit operator type ( type identifier ) explicit operator type ( type identifier )
Compare esto con, digamos, un encabezado de método:
encabezado del método : atributos opt método-modificadoresopt parcial opt tipo de retorno nombre-miembro tipo-parámetro- listaopt ( lista-parámetros-formal opt ) type-parameter-constraints-clausesopt
(Perdón por el formato, no estoy seguro de cómo hacerlo mejor).
Tenga en cuenta que el formato del operador no incluye una lista de parámetros de tipo o restricciones de parámetros de tipo.
Otros consejos
El código se reduce a la línea: return new Foo<U>((U)a.Item)
Cuando intenta asignar una clase base para una clase heredada, lo cual es imposible.
Digamos que T (clase base) es de tipo Stream
y U es de tipo MemoryStream
(heredado de la clase), no se puede asignar un Stream
a una variable de tipo MemoryStream
.
Creo que la respuesta corta es " No es posible. Intente usar un método en su lugar & Quot;
También parece ser engañado de esta pregunta Solución para restricciones de operador sobrecargadas en genéricos .NET