Je m'intéresse de plus près aux génériques et j'ai maintenant une situation pour laquelle j'ai besoin d'aide. Je reçois une erreur de compilation sur la classe 'Dérivée' ci-dessous, comme indiqué dans le titre de l'objet. Je vois beaucoup d'autres articles semblables à celui-ci, mais je ne vois pas la relation. Quelqu'un peut-il me dire comment résoudre ce problème?
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)
{
}
}
}
Je ne peux pas reprocher, mais je suspect que dans votre code actuel, il existe une contrainte quelque part que T : class
- vous devez propager cela pour rendre le compilateur heureux, par exemple (difficile à dire à coup sûr sans un exemple de repro):
public class Derived<SomeModel> : Base<SomeModel> where SomeModel : class, IModel
^^^^^
see this bit
Vous obtenez cette erreur si vous avez contraint T
à devenir un class
Si vous mettez des contraintes sur une classe ou une méthode générique, toutes les autres classes ou méthodes génériques qui l'utilisent doivent avoir "au moins" ces contraintes.