2011-06-23 68 views
133

Estoy profundizando en los genéricos y ahora tengo una situación en la que necesito ayuda. Aparece un error de compilación en la clase 'Derivada' a continuación, como se muestra en el título del tema. Veo muchas otras publicaciones similares a esta, pero no veo la relación. ¿Puede alguien decirme cómo resolver esto?El tipo debe ser un tipo de referencia para usarlo como parámetro 'T' en el tipo o método genérico

using System; 
using System.Collections.Generic; 


namespace Example 
{ 
    public class ViewContext 
    { 
     ViewContext() { } 
    } 

    public interface IModel 
    { 
    } 

    public interface IView<T> where T : IModel 
    { 
     ViewContext ViewContext { get; set; } 
    } 

    public class SomeModel : IModel 
    { 
     public SomeModel() { } 
     public int ID { get; set; } 
    } 

    public class Base<T> where T : IModel 
    { 

     public Base(IView<T> view) 
     { 
     } 
    } 

    public class Derived<SomeModel> : Base<SomeModel> where SomeModel : IModel 
    { 

     public Derived(IView<SomeModel> view) 
      : base(view) 
     { 
      SomeModel m = (SomeModel)Activator.CreateInstance(typeof(SomeModel)); 
      Service<SomeModel> s = new Service<SomeModel>(); 
      s.Work(m); 
     } 
    } 

    public class Service<SomeModel> where SomeModel : IModel 
    { 
     public Service() 
     { 
     } 

     public void Work(SomeModel m) 
     { 

     } 
    } 
} 
+0

No obtengo ningún error de compilación –

+0

Este código no muestra ese error. Compila limpiamente. –

Respuesta

313

No puedo repro, pero sospechoso que en su código real hay una restricción en alguna parte que T : class - lo que necesita para propagar que para hacer feliz al compilador, por ejemplo (difícil de decir con seguridad sin un ejemplo repro):

public class Derived<SomeModel> : Base<SomeModel> where SomeModel : class, IModel 
                    ^^^^^ 
                   see this bit 
+6

Gracias, eso es todo. Una vez que agregué la restricción de clase, el error de compilación desapareció. Lo siguiente parece satisfacer la necesidad de tipo de referencia. – ChrisS

+0

esto es lo que funciona. Base pública clase donde T: clase, IModel { Base pública (IView vista) { } } clase pública Derivado : Base donde SomeModel: clase, IModel { pública derivados (IView view) : base (ver) { SomeModel m = (SomeModel) Activator.CreateInstance (typeof (SomeModel)); Servicio s = nuevo Servicio (); s.Trabajo (m); } } – ChrisS

+0

Ayudado :) Gracias :) Como nota al margen, creo que no deberíamos copiar la misma restricción una y otra vez si ya se ha aplicado en la interfaz, IMO. – Celdor

33

Se obtiene este error si se ha limitado a ser un Tclass

5

Si coloca restricciones en una clase genérica o metho d, cualquier otra clase o método genérico que lo use debe tener "al menos" esas restricciones.

Cuestiones relacionadas