2009-03-01 18 views
7

私は、APIコーディング中にジェネリックリファレンスタイプとジェネリック値タイプの違いについて混乱しました。C#ジェネリックス:参照型と値

class ReferenceGeneric <T> where ??? 
{ 

} 

struct ValueGeneric <T>: where ??? 
{ 


} 

編集

みんな、問題は、これら二つの獣の間の制約と機能(最も重要な/簡単に見落とさもの)についての違いがあるものです質問を明確にし、私が何をしているのかを知りたい:ジェネリックリファレンスタイプで何ができるのかを知りたいし、ジェネリック値タイプではできない。

編集#2さらに詳しい説明:ジェネリック型が参照型または値型の場合、どのようにTを制約できますか?各型をどのように制約できますか?

+0

あなたは非常にconfですあなたはそこに答えがありますが、後は​​何ですか? – andleer

+0

あなたは時々調整が必要だと言った。あなたは例を挙げることができますか? –

+0

私は編集の質問について詳述しました。 –

答えて

13

は、構造体として宣言されたものが常に値型であり、クラスとして宣言されて何かが常に参照型であることに注意してください。言い換えれば、List<int>はまだ参照型である、とあなたが持っていた場合:その後、

struct Foo<T> 
{ 
    T value; 
} 

Foo<string>はまだ値の型になります。

に汎用タイプを指定します。値タイプと参照タイプの通常のルールに従うだけです。タイプTの中での中で行うことができるものは、どのように/ Tが制約されているかによって異なります。ジェネリック型自体が構造体であるかクラスであるかに基づいて変化しません。

EDIT:SashaはコメントにNullable<T>を記載しています。 Nullable<T>以外の「例外」が「where T : struct」または「where T : class」のいずれかの制約を満たしていないとわかりません。それはまだ価値のタイプです(これはポイントの一部です)。 EDIT2に対応して

+0

Jon、構造体の型がNullableの場合は例外があります。それについても詳しく説明しますか? thx –

+0

詳細をお寄せいただきありがとうございます。 –

+0

「クラスとして宣言されているものは、常に値型です」という誤植ですか? – ShuggyCoUk

8

参考:

class ReferenceGeneric <T> where T: class 
{ 

} 

値:上の次のページから

struct ValueGeneric <T> where T: struct 
{ 


} 

あなたは以下で参照または値を許可種類を制限することができますMSDN http://msdn.microsoft.com/en-us/library/d5x73970.aspx

+0

あなたがクラスで構造体を拘束することができます。struct ValueGeneric T:クラス { } –