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


211

我正在深入研究泛型,现在有需要帮助的情况。如主题标题所示,我在下面的“派生”类上遇到编译错误。我看到许多其他与此类似的帖子,但我没有看到这种关系。有人可以告诉我如何解决吗?

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

        }
    }
}

我没有任何编译错误
Vince Panuccio

此代码未显示该错误。编译干净。
Marc Gravell

Answers:


474

我无法复制,但是我怀疑在您的实际代码中某个地方存在约束T : class-例如,您需要传播该约束以使编译器满意(如果没有一个复制实例,很难确定):

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

12
谢谢,是的。一旦添加了类约束,编译错误就消失了。以下内容似乎可以满足对引用类型的需求。
ChrisS 2011年

这是可行的。公共类Base <T>,其中T:类,IModel {公共Base(IView <T>视图){}}公共类Derived <SomeModel>:Base <SomeModel>,其中SomeModel:类,IModel {public Derived(IView <SomeModel> view):base(view){SomeModel m =(SomeModel)Activator.CreateInstance(typeof(SomeModel)); Service <SomeModel> s =新Service <SomeModel>(); s.Work(m); }
ChrisS 2011年

还提供了帮助:)谢谢:)作为一个补充说明,我认为我们不应该一次又一次地复制相同的约束,如果它已经在IMO接口中应用了。
Celdor 2014年


9

如果将约束放在通用类或方法上,则使用它的所有其他通用类或方法都必须“至少”具有这些约束。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.