我的代碼給我錯誤正是它說「不能轉換int和T的隱式」我使用C#泛型有什麼問題?
public class Vector3D<T>
{
public T x;
public T y;
public T z;
Vector3D()
{
x = 0;
y = 0;
z = 0;
}
}
我的代碼給我錯誤正是它說「不能轉換int和T的隱式」我使用C#泛型有什麼問題?
public class Vector3D<T>
{
public T x;
public T y;
public T z;
Vector3D()
{
x = 0;
y = 0;
z = 0;
}
}
。你有這樣的代碼,如「x = 0」 - 是一個int常數。但不能保證T是int,所以......這是無效的。沒有隱式轉換(並且不會轉換爲T)。
您所做的唯一錯誤的事情是將值分配給構造函數中的屬性。你不能這樣做,因爲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;
但是,如果你已經知道你需要的int
個Vector
並要提供一些額外的功能,你可以創建一個派生類型,設置T
(到int
這裏),這樣你就不必再指定它了:
public class Int32Vector3D : Vector3D<Int32>
{
public Int32Vector3D()
{
x = 0;
y = 0;
z = 0;
}
// custom members for adding, subtracting, translating etc.
}
不錯的答案,也許還可以添加'default(T)'作爲'Vector3D
您使用int類型的值初始化類型T.你不應該使用Vector的泛型類型。像這樣的^
public class Vector3D
{
public int x;
public int y;
public int z;
Vector3D()
{
x = 0;
y = 0;
z = 0;
}
}
編譯器不知道T可以是一個int,爲此它給你的隱含錯誤。你可以輸入它,然而問題是你真的需要一個Generic類嗎?或只有一個int並說float?
有可從字面0
到T
的隱式轉換。例如,T
可能是string
,或TextField
...
你可能想限制你的載體結構類型:
public class Vector3D<T> where T : struct
...但即使是這樣,你可以有一個Vector3D<DateTime>
,和您無法將0轉換爲DateTime
。你可以,但是,使用默認值類型:
x = default(T);
不過,這已爲每一個字段的默認值,所以你並不需要分配的。在這一點上,你仍然可以想出「奇怪的」向量(並且你會發現很難對向量執行其他操作,比如將它們乘以標量或將它們加在一起),但至少它會編譯。
你肯定需要泛型類型嗎?您可能會發現,最終獲得幾種特定類型(Vector3dInt32
,Vector3dSingle
,Vector3dDouble
例如)會更有成效。我知道這不是優雅的,但考慮到「T
必須是數字」沒有乾淨的約束,也沒有簡單的方法在T
上執行數字操作,它可能是最實際的解決方案。
您也可以考慮:
@SonerGönül:類型的呃,你絕對可以聲明字段'T'。你不能從'0'轉換爲'T'。 – 2014-11-25 07:14:03
刪除構造函數的一部分,一切都會好的......你會在聲明時使用初始值設定項。 – 2014-11-25 07:14:33
@JonSkeet是的,我想說的是,OP不能在'T'中使用'0',因爲編譯器必須知道這些字段是什麼類型,並且必須知道'0'與'T'之間是否存在隱式對話'類型,對吧? – 2014-11-25 07:18:48