El tipo debe ser un tipo de referencia para usarlo como parámetro ‘T’ en el tipo o método genérico

Estoy profundizando en generics y ahora tengo una situación en la que necesito ayuda. Aparece un error de comstackció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?

using System; using System.Collections.Generic; namespace Example { public class ViewContext { ViewContext() { } } public interface IModel { } public interface IView where T : IModel { ViewContext ViewContext { get; set; } } public class SomeModel : IModel { public SomeModel() { } public int ID { get; set; } } public class Base where T : IModel { public Base(IView view) { } } public class Derived : Base where SomeModel : IModel { public Derived(IView view) : base(view) { SomeModel m = (SomeModel)Activator.CreateInstance(typeof(SomeModel)); Service s = new Service(); s.Work(m); } } public class Service where SomeModel : IModel { public Service() { } public void Work(SomeModel m) { } } } 

No puedo reproducir, pero sospecho que en tu código real hay una restricción en alguna parte que T : class – necesitas propagar eso para hacer feliz al comstackdor, por ejemplo (difícil de decir sin un ejemplo de repro):

 public class Derived : Base where SomeModel : class, IModel ^^^^^ see this bit 

Obtiene este error si ha limitado a T a ser una class

Si pone restricciones en una clase o método genérico, cualquier otra clase o método genérico que lo use debe tener “al menos” esas restricciones.