1. ホーム
  2. c#

C# GenericsがDelegateの型制約を許さない

2023-08-16 09:35:52

質問

C#で以下のようなクラスを定義することは可能でしょうか?

class GenericCollection<T> : SomeBaseCollection<T> where T : Delegate

昨夜、.NET 3.5でどうしてもこれを達成することができませんでした。私は

delegate, Delegate, Action<T> and Func<T, T>

これは何らかの方法で許容されるべきと思われます。自作のEventQueueを実装しようとしています。

結局、こんな感じで【原始的な近似を意識して】やっているだけです。

internal delegate void DWork();

class EventQueue {
    private Queue<DWork> eventq;
}

しかし、そうすると、異なるタイプの関数に対して同じ定義を再利用する能力を失ってしまいます。

感想は?

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

多くのクラスがジェネリック制約として利用できません - Enumもその一つです。

デリゲートの場合、最も近いのは ": class" で、おそらくリフレクションを使って(例えば静的コンストラクタで)T がデリゲートであることを(例えば静的コンストラクタで)チェックするためにリフレクションを使うかもしれません。

static GenericCollection()
{
    if (!typeof(T).IsSubclassOf(typeof(Delegate)))
    {
        throw new InvalidOperationException(typeof(T).Name + " is not a delegate type");
    }
}