En una pregunta diferente de StackExchange, noté que alguien usaba este prototipo:
void DoSomething<T>(T arg) where T: SomeSpecificReferenceType
{
//Code....
}
Teniendo en cuenta que solo hay una restricción de tipo único ( SomeSpecificReferenceType
), cuál es la diferencia y la ventaja de escribirlo así, en lugar de simplemente:
void DoSomething(SomeSpecificReferenceType arg)
{
//Code....
}
En ambos casos, arg
estará sujeto a verificación de tipo en tiempo de compilación. En ambos casos, el cuerpo del método puede confiar con seguridad en el conocimiento que arg
es (o es descendiente de) un tipo específico que se conoce en tiempo de compilación.
¿Es este el caso de un desarrollador entusiasta que aprende sobre genéricos antes de aprender sobre la herencia ordinaria? ¿O hay una razón legítima por la cual una firma de método se escribiría de esta manera?
Respuestas:
Sí, probablemente lo sea.
Tal vez . En general, tendría más sentido si hubiera un valor de retorno involucrado
T
u otro parámetro que se utilizaraT
.Pero, es posible que los componentes internos del código utilicen
T
(¿quizás como un argumento para un serializador?) Y necesiten utilizar específicamenteT
y no la clase de restricción. Ocasionalmente verá que cuando la restricción es una interfaz emparejada con lanew
restricción y las entrañas del método creanT
s por alguna razón.Entonces, aunque es raro ver la versión de restricción necesaria, hay algunas ocasiones en que es así. Y siempre es posible que el método utilizado a necesitarlo, pero ahora no lo hace y el desarrollador dejó como es la de no introducir un cambio importante.
fuente
Creo que me recuerdo escribiendo una respuesta que contiene esto.
En ese momento, la razón era la siguiente:
(El código puede ser diferente. Solo para ilustrar una de las posibles razones por las cuales hay una restricción en el parámetro de tipo en un método genérico).
Básicamente, el código entra en codificaciones manuales de manipulaciones de tipo. También podría estar mezclado con algunas cosas de reflexión.
Por ejemplo, al usar
Method<T>(T arg) where T : ...
, uno puede reemplazararg.GetType()
contypeof(T)
. Sin embargo, no sé si esa elección es buena o mala.Supongo que este es solo un ejemplo de que el autor (posiblemente yo u otra persona) no está analizando cuidadosamente todas las posibilidades de codificación, al mismo tiempo centrándose demasiado en una pregunta / problema diferente.
fuente