1. ホーム
  2. c#

[解決済み] C#の汎用型制約としてinterfaceを使用するにはどうすればよいですか?

2022-04-20 16:34:03

質問

以下の関数宣言を取得する方法はありますか?

public bool Foo<T>() where T : interface;

つまり、T はインターフェース型(以下同様 where T : class であり、かつ struct ).

現在、私はこれに落ち着いています。

public bool Foo<T>() where T : IBase;

IBaseは空のインターフェースとして定義され、私のカスタムインターフェースに継承される... 理想的ではありませんが、うまくいくはずです... なぜ、汎用的な型はインターフェースでなければならないと定義できないのでしょうか?

参考までに、私がこれを望む理由は Foo はインターフェイスの型を必要とするリフレクションを行っています...。私はそれを通常のパラメータとして渡して、必要なチェックを関数自体で行うことができましたが、これはより多くのタイプセーフに見えました(そして、すべてのチェックがコンパイル時に行われるので、私は少しよりパフォーマンスであると思います)。

どのように解決するのか?

一番近いのは、(base-interfaceのアプローチを除けば)"です。 where T : class "で、参照型を意味します。任意のインターフェイスを意味する構文はありません。

これ(" where T : class ")は、例えばWCFで、クライアントをサービスコントラクト(インターフェース)に限定するために使用されます。