Тип должен быть ссылочным типом, чтобы использовать его как параметр "T" в общем типе или методе

Я углубляюсь в дженерики, и теперь мне нужна помощь. Я получаю ошибку компиляции в классе "Производный" ниже, как показано в заголовке темы. Я вижу много других сообщений, похожих на этот, но я не вижу отношений. Может ли кто-нибудь сказать мне, как это решить?

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

        }
    }
}

Ответ 1

Я не могу воспроизвести, но я подозреваю, что в вашем фактическом коде есть ограничение где-то T : class - вам нужно распространять это, чтобы сделать компилятор счастливым, например (трудно сказать без примера воспроизведения ):

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

Ответ 2

Вы получаете эту ошибку, если у вас есть ограничение T как class

Ответ 3

Если вы помещаете ограничения на общий класс или метод, каждый другой общий класс или метод, который его использует, должен иметь "по крайней мере" эти ограничения.