2014-11-25 17 views
0

我的代碼給我錯誤正是它說「不能轉換int和T的隱式」我使用C#泛型有什麼問題?

public class Vector3D<T> 
{ 
    public T x; 
    public T y; 
    public T z; 
    Vector3D() 
    { 
     x = 0; 
     y = 0; 
     z = 0; 
    } 
} 
+0

@SonerGönül:類型的呃,你絕對可以聲明字段'T'。你不能從'0'轉換爲'T'。 – 2014-11-25 07:14:03

+0

刪除構造函數的一部分,一切都會好的......你會在聲明時使用初始值設定項。 – 2014-11-25 07:14:33

+0

@JonSkeet是的,我想說的是,OP不能在'T'中使用'0',因爲編譯器必須知道這些字段是什麼類型,並且必須知道'0'與'T'之間是否存在隱式對話'類型,對吧? – 2014-11-25 07:18:48

回答

1

。你有這樣的代碼,如「x = 0」 - 是一個int常數。但不能保證T是int,所以......這是無效的。沒有隱式轉換(並且不會轉換爲T)。

9

您所做的唯一錯誤的事情是將值分配給構造函數中的屬性。你不能這樣做,因爲T的類型是未知的,直到你指定它並創建你的類的一個實例。你做的方式,編譯器不知道還使用哪種類型:

public class Vector3D<T> 
{   
    public T x; 
    public T y; 
    public T z;   
} 

T意思是:你可以在這裏用一些具體的以後當你實例化類。

例如與int S:

var vector = new Vector3D<int>() 
{ 
    x = 0, 
    y = 0, 
    z = 0 
}; // I'm using the object initializer here. 

它是一樣的:

var vector = new Vector3D<int>(); 
vector.x = 0; 
vector.y = 0; 
vector.z = 0; 

但是,如果你已經知道你需要的intVector並要提供一些額外的功能,你可以創建一個派生類型,設置T(到int這裏),這樣你就不必再指定它了:

public class Int32Vector3D : Vector3D<Int32> 
{ 
    public Int32Vector3D() 
    { 
     x = 0; 
     y = 0; 
     z = 0; 
    } 

    // custom members for adding, subtracting, translating etc. 
} 
+0

不錯的答案,也許還可以添加'default(T)'作爲'Vector3D '的默認值。這將爲'int'情況賦予'0',爲一個實例賦予'null'... – 2015-01-07 07:42:13

0

您使用int類型的值初始化類型T.你不應該使用Vector的泛型類型。像這樣的^

public class Vector3D 
{ 
    public int x; 
    public int y; 
    public int z; 

    Vector3D() 
    { 
     x = 0; 
     y = 0; 
     z = 0; 
    } 
} 
0

編譯器不知道T可以是一個int,爲此它給你的隱含錯誤。你可以輸入它,然而問題是你真的需要一個Generic類嗎?或只有一個int並說float?

4

有可從字面0T的隱式轉換。例如,T可能是string,或TextField ...

你可能想限制你的載體結構類型:

public class Vector3D<T> where T : struct 

...但即使是這樣,你可以有一個Vector3D<DateTime>,和您無法將0轉換爲DateTime。你可以,但是,使用默認值類型:

x = default(T); 

不過,這已爲每一個字段的默認值,所以你並不需要分配的。在這一點上,你仍然可以想出「奇怪的」向量(並且你會發現很難對向量執行其他操作,比如將它們乘以標量或將它們加在一起),但至少它會編譯。

你肯定需要泛型類型嗎?您可能會發現,最終獲得幾種特定類型(Vector3dInt32Vector3dSingleVector3dDouble例如)會更有成效。我知道這不是優雅的,但考慮到「T必須是數字」沒有乾淨的約束,也沒有簡單的方法在T上執行數字操作,它可能是最實際的解決方案。

您也可以考慮:

  • 你肯定想一類,或者將一個結構更合適? (如果你必須有一個類,可考慮將其密封。)
  • 我會避免使用公共領域
  • 我會認真考慮製造型不變