2012-03-27 23 views
12

¿Es posible escribir una construcción similar?
quiero fijar, de alguna manera, valor por defecto de argumento de tipo T.Métodos genéricos y argumentos opcionales

private T GetNumericVal<T>(string sColName, T defVal = 0) 
    { 
     string sVal = GetStrVal(sColName); 
     T nRes; 
     if (!T.TryParse(sVal, out nRes)) 
      return defVal; 

     return nRes; 
    } 

Además, encontré siguiente enlace: Generic type conversion FROM string
pienso, este código debe trabajar

private T GetNumericVal<T>(string sColName, T defVal = default(T)) where T : IConvertible 
{ 
    string sVal = GetStrVal(sColName); 
    try 
    { 
     return (T)Convert.ChangeType(sVal, typeof(T)); 
    } 
    catch (FormatException) 
    { 
     return defVal; 
    }    
} 

Respuesta

15

No he intentado esto, pero cambie T defVal = 0 a T defVal = default(T)

4

Si sabe que T will hav ea sin parámetros constructor puede utilizar la nueva T() como tal:

private T GetNumericVal<T>(string sColName, T defVal = new T()) where T : new() 

contrario, puede utilizar por defecto (T)

private T GetNumericVal<T>(string sColName, T defVal = default(T)) 
4

Para responder a la pregunta que trabajaría para establecer el valor por defecto

private T GetNumericVal<T>(string sColName, T defVal = default(T)) 
{ 
    string sVal = GetStrVal(sColName); 
    T nRes; 
    if (!T.TryParse(sVal, out nRes)) 
     return defVal; 

    return nRes; 
} 

Pero no puede llamar al método TryParse estático ya que el compilador no tiene manera de saber que el tipo T declara este método estático.

+0

Sí, no puedo llamar a TryParse. Pero tal vez algo similar? Tal vez, agregue alguna restricción al parámetro type (me refiero a 'where: ...')? Si los tipos numéricos implementan alguna interfaz de conversión. – hardsky

+0

CLR no tiene ningún concepto de "métodos estáticos virtuales", el compilador no puede inferir métodos estáticos de un tipo. Hasta donde sé, no hay una solución limpia para eso. –

+0

http://stackoverflow.com/questions/196661/calling-a-static-method-on-a-generic-type-parameter para más detalles –