Тип должен быть ссылочным типом, чтобы использовать его как параметр "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
Если вы помещаете ограничения на общий класс или метод, каждый другой общий класс или метод, который его использует, должен иметь "по крайней мере" эти ограничения.