web-dev-qa-db-fra.com

Le type doit être un type de référence pour pouvoir être utilisé comme paramètre 'T' dans le type ou la méthode générique

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)
        {

        }
    }
}
197
ChrisS

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
443
Marc Gravell

Vous obtenez cette erreur si vous avez contraint T à devenir un class

42
thekip

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.

8
Guish