16

次のクラスを考えると...

public abstract class FooBase<TBar> where TBar : BarBase{}
public abstract class BarBase{}
public class Bar1 : BarBase{}
public class Foo1 : FooBase<Bar1> {}

...そして次の方法...

public TBar DoSomething<TFoo, TBar>(TFoo theFoo)
    where TFoo : FooBase<TBar>
    where TBar : BarBase
{
    return default(TBar);
}

次のコード行が戻り値の型を暗示できないのはなぜですか?

Bar1 myBar = DoSomething(new Foo1());

代わりに、このようなジェネリック型を指定する必要があります...

Bar1 myBar = DoSomething<Foo1, Bar1>(new Foo1());
4

1 に答える 1

23

メソッド型推論では、メソッド型パラメーター (*) のジェネリック制約が無視されます。メソッド型推論の理由は、引数仮パラメーター型と比較することによって行うことができる推定についてのみです。仮パラメーターの型に現れる唯一のジェネリック型パラメーターは TFoo であるため、TBar を推測する方法はありません。

多くの人は、この設計上の決定が間違っている、間違っている、間違っていると信じています。私は彼らの主張を受け入れますが、この決定は、私の意見ではいくつかの優れた特性につながります. この問題に関する長期にわたる議論については、このブログ記事の無数のコメントを参照してください。私は間違っている、間違っている、間違っていると言っています。

http://blogs.msdn.com/b/ericlippert/archive/2009/12/10/constraints-are-not-part-of-the-signature.aspx


(*) 一般的な制約ではなく、メソッド型パラメーターの制約は無視されると言ったことに注意してください。推定された仮パラメーター型が、型パラメーターの制約に違反するように構築されたジェネリック型である場合、この事実により型推論が失敗し、メソッドはオーバーロード解決の候補になりません。しかし、「うーん、明らかにこれはうまくいかない」以外の制約から推論することは決してありません。

于 2011-07-08T21:33:58.580 に答える