2010-03-29 8 views
8

Solo un pensamiento.¿Qué pasa con los parámetros de tipo genérico opcionales en C# 5.0?

¿No sería útil tener parámetros de tipo opcionales en C#?

Esto haría la vida más simple. Estoy cansado de tener múltiples clases con el mismo nombre, pero diferentes parámetros de tipo. También VS no admite esta muy vell (nombres de archivo) :-)

Este sería, por ejemplo, eliminar la necesidad de un IEnumerable no genérico:

interface IEnumerable<out T=object>{ 
    IEnumerator<T> GetEnumerator() 
} 

¿Qué opinas?

+0

En su ejemplo , ¿cómo distinguirías entre 'IEnumerable ' y 'IEnumerable'? ¿El primero sería 'IEnumerable <>'? –

+0

typeof (IEnumerable ) == typeof (IEnumerable) == typeof (IEnumerable <>). MakeGenericOrSo (typeof (object)) –

+0

La solución estándar aquí para el problema del nombre de archivo, y creo que uno sancionado por el equipo VS (aunque no puedo encontrar un enlace en este momento), es guardar el archivo para AGenericType con un nombre como AGenericType'4.cs. –

Respuesta

3

Definitivamente estoy a favor.

Actualmente estoy escribiendo métodos de ayuda para diferentes escenarios donde quiero pasar referencias a diferentes miembros y métodos de clases. Para lograr esto estoy tomando, por ejemplo, un Expression<Func<TIn, TOut>> como argumento para el asistente (que me permite llegar al método con una expresión lambda, manteniendo todo fuertemente tipado).

PERO - Actualmente necesito definir un nuevo método de ayuda para cada número diferente de argumentos de entrada, ya que necesito tener una cantidad diferente de argumentos genéricos para él.En lugar de

HelperMethod<TIn>(Expression<Action<TIn>> arg) // Yes, C# can distinguish 
HelperMethod<TOut>(Expression<Func<TOut>> arg) // these two from eachother 
HelperMethod<TIn, TOut>(Expression<Func<TIn, TOut>> arg) 
HelperMethod<TIn1, TIn2, TOut>(Expression<Func<TIn1, TIn2, TOut>> arg) 
// etc 

Podría conformarse con, a lo sumo, dos métodos:

HelperMethod<TIn>(Expression<Action<TIn>> arg) 
HelperMethod<TOut, TIn1 = DummyType, ...>(Expression<Func<TIn1, ..., TOut> arg) 

En mi caso, sería evitar una gran cantidad de duplicación de código ...

2

¿Cuál sería el uso principal de esta función de idioma? Puedo ver que podría ayudar con algunas tareas administrativas, como nombres de archivos y menos tipeo, pero más allá de eso no veo cuán útil sería.

Además, esta característica complicaría significativamente cualquier restricción genérica que pudiera colocarse en el parámetro de tipo genérico y el propio tipo predeterminado tendría que funcionar como una especie de restricción genérica.

Creo que esto complicaría el lenguaje sin ofrecer ningún beneficio real para el desarrollador.

+1

Mantendría las jerarquías tipo más limpias. Dado un A y B : A , B: A derivaría del mismo tipo que B

+0

El tipo predeterminado estaría sujeto a todas las restricciones, por lo que el código subsiguiente podría permanecer ignorante. Básicamente, haría IEnumerable lo mismo que IEnumerable (como un ejemplo, la utilidad real de la función viene con una arquitectura más compleja) –

0

No estoy seguro de lo que está proponiendo exactamente. Actualmente puede haber tipos con el mismo nombre pero diferentes parámetros de tipo, pero que no están relacionados de ninguna manera con la herencia. ¿Qué haría entonces tu propuesta?

Además, si la biblioteca de la clase base se rediseñó desde cero, es casi seguro que no habría una interfaz IEnumerable no genérica, solo existe porque la CLR no admitía genéricos cuando se introdujo la interfaz, y el genérico la interfaz hereda solo para que el código heredado siga funcionando. Las clases recientemente declaradas se están creando para un CLR que admite genéricos, por lo que el problema ya no es relevante.

0

Recientemente me encontré con un caso que podría haber usado algo así, pero no del todo. Tenía un método que realiza una transformación de clases, entre la clase A y su clase asociada AChild y clase B y clase BChild. Por lo general, el par A/AChild era el mismo que B/BChild, pero a veces A era una clase base de B y AChild una clase base de BChild.

Habría sido agradable poder decir que mi parámetro de tipo TB predeterminado de TA, y que TBChild predeterminado de TAChild.

Tenga en cuenta que esta era una situación en la que era necesario escribir los parámetros de tipo, ya que la inferencia no funcionaría.

Cuestiones relacionadas