私はC#でジェネリックスが大好きですが、時にはそれらを使って作業することで少し複雑になることがあります。以下の問題は、私は今、毎回走っています。このシナリオをよりシンプルにする方法はありますか?今、私の質問があるC#でネストされたジェネリックを簡略化することは可能ですか?
public class In : Inner
{
}
public class Out : Outer<In>
{
}
public class HandleOut : Handler<Out, In>
{
public override void SetValue(In value) { }
}
:
public abstract class Inner
{
}
public abstract class Outer<T>
where T : Inner
{
}
public abstract class Handler<TOuter, TInner>
where TOuter : Outer<TInner>
where TInner : Inner
{
public abstract void SetValue(TInner value);
}
そして、いくつかの単純な実装:のために私はどのように、私は誰かが3つのベースクラスを考える
:)をすることができます願って見ることができませんのタイプはTInner
で、タイプが「Out」であるため、HandleOut
の定義を簡略化してpublic class HandleOut : Handler<Out>
のようなものにしても、のパラメータとして内部タイプを使用できるようになります?
これは非常に単純な例ですが、通常はすべての定義を第1の型から論理的に推論できるような定義では、ジェネリック型の長いリストを取得することがあります。私は行方不明のトリックはありますか?
コンパイルするようにコードを修正しました。質問のPOVから正しいかどうか確認してください。 – Enigmativity
あなたが尋ねていると思うものと100%一致しているわけではありませんが、Eric Lippertの[なぜジェネリック制約は継承されないのですか?](http://ericlippert.com/2013/07/15/なぜ、継承されていないという事実は、Enigmativityがあなたのコードを修正して* more * constraintを追加しなければならなかった理由です) –
ありがとう、@エニグマティビティ。私はちょうどその場でコードを書いた - あなたの変更はちょうど私の考えによるものです:) –