複数の制約を持つジェネリックメソッド


251

2つのジェネリックパラメーターを持つジェネリックメソッドがあります。以下のコードをコンパイルしようとしましたが、機能しません。.NETの制限ですか?異なるパラメーターに対して複数の制約を設けることは可能ですか?

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

回答:


402

これを行うことは可能です。構文が少し間違っているだけです。whereコンマで区切るのではなく、制約ごとにが必要です。

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

8

@LukeHによる別の使用法の主な回答に加えて、クラスの代わりに複数のインターフェースを使用できます。(1つのクラスとnカウントのインターフェース)このように

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

または

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

1

@LukeHによる主な回答に加えて、依存関係の注入に問題があり、これを修正するのに少し時間がかかりました。同じ問題に直面している人にとって、それは共有する価値があります:

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

このように解決されます。コンテナー/サービスでは、キーはtypeofおよびコンマ(、)です

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

これはこの回答で言及されまし


2
この答えは、型制約とはまったく関係ありません。バインドされていないジェネリック型と、C#でそれらを綴る方法についてです。stackoverflow.com/a/2173115/2157640 stackoverflow.com/a/6607299/2157640
Palec
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.