346

I have a generic method which has two generic parameters. I tried to compile the code below but it doesn't work. Is it a .NET limitation? Is it possible to have multiple constraints for different parameter?

public TResponse Call<TResponse, TRequest>(TRequest request)
  where TRequest : MyClass, TResponse : MyOtherClass
0

4 Answers 4

544

It is possible to do this, you've just got the syntax slightly wrong. You need a where for each constraint rather than separating them with a comma:

public TResponse Call<TResponse, TRequest>(TRequest request)
    where TRequest : MyClass
    where TResponse : MyOtherClass
2
  • 12
    Can you have multiple restraints on the same generic like where T : MyClass where T : MyOtherClass ?
    – WDUK
    Commented Apr 23, 2022 at 8:18
  • 1
    @WDUK Sort of. C# does not allow multiple inheritance. However, you can specify some interfaces and other special conditions, as well as the single class. Each requirement is separated by a comma (partially why Martin's attempt was not valid C#: commas in that context already meant something else). So, where T : MyClass, IMyInterface is valid, but where T : MyClass, MyOtherClass is not. Commented Sep 14, 2023 at 20:25
27

In addition to the main answer by @LukeH with another usage, we can use multiple interfaces instead of class. (One class and n count interfaces) like this

public TResponse Call<TResponse, TRequest>(TRequest request)
  where TRequest : MyClass, IMyOtherClass, IMyAnotherClass

or

public TResponse Call<TResponse, TRequest>(TRequest request)
  where TRequest : IMyClass,IMyOtherClass
11

In addition to the main answer by @LukeH, I have issue with dependency injection, and it took me some time to fix this. It is worth to share, for those who face the same issue:

public interface IBaseSupervisor<TEntity, TViewModel> 
    where TEntity : class
    where TViewModel : class

It is solved this way. in containers/services the key is typeof and the comma (,)

services.AddScoped(typeof(IBaseSupervisor<,>), typeof(BaseSupervisor<,>));

This was mentioned in this answer.

1
7

Each constraint need to be on own line and if there are more of them for single generic parameter then they need to separated by comma.

public TResponse Call<TResponse, TRequest>(TRequest request)
    where TRequest : MyClass 
    where TResponse : MyOtherClass, IOtherClass

Edited as per comment

2
  • This answer is incorrect, both in the comma following MyClass (see most upvoted answer) and the claim constraints need to be on separate lines. I'd fix it, but the edit queue is full.
    – Todd West
    Commented Sep 22, 2021 at 18:19
  • Thanks @ToddWest. I have removed the additional comma after MyClass
    – Pavel Sem
    Commented Sep 23, 2021 at 9:45

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.