该types必须是引用types才能在通用types或方法中将其用作参数“T”

我越来越深入到generics,现在有一个我需要帮助的情况。 在主题标题中显示的“Derived”类下面出现编译错误。 我看到很多其他类似的post,但我没有看到这种关系。 有人能告诉我如何解决这个问题吗?

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

我不能repro,但我怀疑在你的实际代码中有一个T : class地方 – 你需要传播它来使编译器感到高兴,例如(很难肯定没有repro的例子):

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

如果你把T限制在一个class你会得到这个错误

如果您对generics类或方法施加约束,则使用它的每个其他generics类或方法都需要具有“至less”这些约束。