2011-09-06 25 views
8

Hay una clase base que tiene un método de tipo genérico y estoy seguro de que en mi derivada devolveré una cadena. Este es mi código:La declaración de parámetro de tipo debe ser un identificador, no un tipo

public abstract class Base 
    { 
     public virtual T GetSomething<T>() 
     { 
      return default(T); 
     } 
    } 

    public class Extended : Base 
    { 
     public override string GetSomething<string>() 
     { 
      return string.Empty; 

      //return base.GetSomething<T>(); 
     } 
    } 

Pero este código no se compila. ¿Alguien puede detectar el error? Estoy seguro de que en mi clase Extendida solo quiero devolver la cadena. ¿Cómo puedo solucionar esto?

Respuesta

8

No puede anular un método genérico con una implementación concreta; así no es como funcionan los genéricos. La clase Extended debe ser capaz de manejar llamadas al GetSomething<int>() por ejemplo.

En otras palabras, la firma de un método de anulación debe ser idéntica al método que está anulando. Al especificar una implementación genérica concreta del método, cambia su firma.

considerar el uso de este enfoque:

public override T GetSomething<T>() 
{ 
    if (typeof(T) == typeof(string)) 
     return string.Empty; 

    return base.GetSomething<T>(); 
} 

Tenga en cuenta que el JIT debe optimizar la distancia del condicional al compilar una instanciación particular de este método. (¡Si no es así, no es un JIT muy bueno!)

(La sintaxis de su reemplazo es técnicamente correcta, pero también falla por otros motivos. Por ejemplo, no puede usar la palabra clave string como nombre genérico del parámetro. Y si pudiera, su código todavía no haría lo que quisiera, ni compilaría, ya que el compilador no podría encontrar un método con esa firma en un supertipo).

+2

o cambie la base declaración de clase a 'clase abstracta pública Base ' – Eranga

+0

Quizás, y luego' Extendido: Base '. Eso es ciertamente posible. No está claro de inmediato qué intenta lograr el PO, así que elegí el enfoque que requiere un cambio mínimo en el diseño de la clase. – cdhowie

Cuestiones relacionadas