2012-01-17 18 views
8

は、次のクラスを考えてみましょう:私はクラスであることをTBaseジェネリッククラスの引数を制限してきたクラスとメソッドレベルの汎用タイプの制約の相互作用

public class DerivedClassPool<TBase> where TBase : class 
{ 
    public TBase Get(Type componentType) 
    { 
     // Not important, but you get the idea 
     return Activator.CreateInstance(componentType) as TBase; 
    } 

    public TDerived SomeMethod<TDerived>() where TDerived : TBase 
    { 
     return Get(typeof(TBase)) as TDerived; 
    } 
} 

注:where TBase : class
私はまた、一般的なTDerivedを制限してきましたメソッドの引数はTBaseかそれに由来するもの:where TDerived : TBaseです。

私はas TDerivedライン上のエラーを取得:それはクラス型制約も「クラスの制約

を持っていないため

型パラメータが「TDerived」演算子「と」で使用することはできません

私は、制約classを追加する必要があり、エラーを防ぐために、それを理解ので、私は取得したい:

where TDerived : class, TBase 

TBaseが既にクラスに制限されていて、TDerivedTBaseに拘束されているか、またはそれから派生している場合、なぜこれを行う必要がありますか?

+1

http://stackoverflow.com/questions/8002148/c-sharp-generics-contraints-propagationを参照してください。エリックはそこにそれを置く。 –

+1

@Jason、私はそれが「but」と読む方が良いと思います。 – Joey

+1

@ジョー:十分に公正。私は、文章を始めるために結合詞を使うことは最近正しいと考えられていますが、文章が 'しかし'で始まるときは嫌です。私は高校英語の先生を責めます。彼は古典的な英国の慣例に従いました。 –

答えて

8

更新日:この質問はthe subject of my blog on September 19th, 2011でした。素晴らしい質問をありがとう!


は、なぜ私はTBASEがすでにクラスに制限されており、TDerivedがTBASEまたはそれ由来であるように制約されている場合、これを行うために必要があるのですか?

参照型から値型を派生させることができるためです。 intは参照型objectおよびSystem.ValueTypeから派生し、多くのインタフェースを実装しています。それはintを参照型にしません。

SomeMethod<int>DerivedClassPool<object>のインスタンスで呼び出すことは、intがオブジェクトから派生しているため、完全に合法です。

ここでは、であり、あなたの批判が正当なものとなります。 2つの型パラメータが論理的には参照型のみであり、そのうちの1つだけが「参照型であることがわかっている」と言語によって分類されるように、2つの型パラメータが関連する状況を構築することができる。

読者の練習として:あなたは1つを見つけることができますか? 「参照型であることがわかっている」という正確な定義については、仕様の第10.1.5項を注意深く読む必要があります。

+0

参照型(C#)から派生した独自の値型を作成することはできますか? –

+0

@GeorgeDuckettなぜそれは関係がありますか? –

+0

@OskarKjellin:そうではありません、私は興味があります。 :) –

2

TBaseはインターフェイスなので、TDerivedは値型になる可能性があります。

+0

TBaseはクラスである必要がありますか? –

+1

あなたはそれについては確かですか? http://msdn.microsoft.com/en-us/library/d5x73970.aspx: 'type引数は参照型でなければなりません。これはどんなクラス、インターフェース、デリゲート、または配列タイプにも当てはまります。 ' –

+1

それについて知りませんでした。このクラスでは 'class 'は" value type "を意味すると厄介です。 –

関連する問題