Reputation: 40573
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
Upvotes: 345
Views: 145163
Reputation: 269368
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
Upvotes: 542
Reputation: 1753
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
Upvotes: 7
Reputation: 4539
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
Upvotes: 25
Reputation: 33397
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.
Upvotes: 11