222

I get a compile error

The type must be a reference type in order to use it as parameter 'T' in the generic type or method

on the 'Derived' class below. How to resolve this?

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

        }
    }
}
2
  • I don't get any compile errors Commented Jun 23, 2011 at 8:23
  • This code doesn't show that error. Compiles cleanly. Commented Jun 23, 2011 at 8:25

3 Answers 3

498

I can't repro, but I suspect that in your actual code there is a constraint somewhere that T : class - you need to propagate that to make the compiler happy, for example (hard to say for sure without a repro example):

public class Derived<SomeModel> : Base<SomeModel> where SomeModel : class, IModel
                                                                    ^^^^^
                                                                 see this bit
Sign up to request clarification or add additional context in comments.

3 Comments

Thank you, yes that's it. Once I added the class constraint the compile error went away. The following seems to satisfy the need for refernce type.
here's what works. public class Base<T> where T : class, IModel { public Base(IView<T> view) { } } public class Derived<SomeModel> : Base<SomeModel> where SomeModel : class, IModel { public Derived(IView<SomeModel> view) : base(view) { SomeModel m = (SomeModel)Activator.CreateInstance(typeof(SomeModel)); Service<SomeModel> s = new Service<SomeModel>(); s.Work(m); } }
Helped as well:) Thanks :) As a side note, I think we shouldn't copy the same constrait again and again if it's already applied in interface, IMO.
48

You get this error if you have constrained T to being a class

Comments

10

If you put constrains on a generic class or method, every other generic class or method that is using it need to have "at least" those constrains.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.