2011-02-17 124 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類型的,而不是結構類型。我想我在這裏錯過了一些東西。

也只有使用正確的術語:

int b = 5; 

上午我實例B'創建一個int實例?出於某種原因,當我想到「實例」時,我想到了引用類型。

這裏:

Car c1 = new Car(); 

在這裏,我明白,I'm創建汽車實例或實例C1。

+0

你就不能使用的myNum 呢? – Nekresh 2011-02-17 11:24:13

回答

12

intstruct

在上MSDN


編輯Int32定義看:

這樣做:

int i = 5; 

還有:

MyStruct m = new MyStruct(); 

您正在創建一個與包含結構所需空間一樣大的內存位置。
與參考類型的區別在於,變量mi不是引用那些存儲值的存儲位置,但它們基本上是「值本身」

逸岸當你這樣做:

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

m2並不代表m1相同的內存位置,但m1內容由可變m2

+0

@rauland:編輯添加一些關於struct :)的信息 – digEmAll 2011-02-17 11:46:46

7

代表的新的存儲位置複製根據具有struct Type約束的MSDN,類型參數必須是值類型。可以指定除Nullable以外的任何值類型。

正如diggEmAll已經提到的詮釋是結構

+1

+1。基本上,所有你需要知道的一般約束。 – HuBeZa 2011-02-17 11:28:54

2

是5是一個int和int是一個結構