2011-02-17 14 views
2

私はCは、構造体でなければならない一般的な制約がある場合:C#ジェネリックと制約

class MyNum<C> where C : struct 
{ 
    C a; 
    public MyNum(C a) 
    { 
     this.a = a; 
    } 
} 

struct myStruct 
{ 
    public int a; 
} 

私はこれがコンパイルされることを理解する:

myStruct n = new myStruct(); 
    n.a = 5; 
    MyNum<myStruct> str = new MyNum<myStruct>(n); 

しかし、なぜこのコンパイルは希望を。 ¿番号5は構造ですか?私は、このことによって考え

int b = 5; 

bがint型であることが、構造体を入力しないでしょう。私はここで何かを逃していると思う。私はBをインスタンス化

int b = 5; 

アム:

また、単に正しい用語を使用するには? intインスタンスを作成しますか?何らかの理由で、私が "インスタンス"を考えるとき、私は参照型を考えます。ここで

ここ
Car c1 = new Car(); 

私は - 私は、車のインスタンスを作成したり、C1をインスタンス化することを理解しています。

+0

であなただけの代わりにMyNum を使用することができませんか? – Nekresh

答えて

12

intは、structです。

ルックMSDN


EDIT上Int32定義で:

行う:

int i = 5; 

など:

MyStruct m = new MyStruct(); 

構造体を格納するために必要な領域と同じ大きさのメモリ位置を作成しています。
参照型との違いは、変数miは値を格納するメモリ位置への参照ではありませんが、基本的には"値そのもの"です。あなたが

Infactは:

MyStruct m1 = new MyStruct(); 
MyStruct m2 = m1; 

m2m1の同じメモリ位置を示すものではありませんが、m1の内容を変数m2

+0

@ cyland:構造体に関する情報を追加するように編集: – digEmAll

7

に代表されるメモリの新しい場所にコピーされますstruct型制約を持つMSDNによれば、型引数は値型でなければなりません。 Nullableを除く任意の値型を指定できます。

そしてdiggEmAllとしてすでに述べたようにint型は、はい5構造体

+1

+1これは、基本的には、一般的な制約について知っておく必要があることです。 – HuBeZa

2

でint型で、intは構造