206 votes

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 du sujet. 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)
        {

        }
    }
}
 

462voto

Marc Gravell Points 482669

Je ne peux pas reproduire, mais je soupçonne que dans votre code réel, il existe une contrainte quelque part que T : class - vous devez propager cela pour rendre le compilateur heureux, par exemple (difficile à dire sans reproche Exemple):

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

43voto

thekip Points 2129

Vous obtenez cette erreur si vous avez contraint T à être class

9voto

Guish Points 879

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X