我的代码给了我错误“无法在int和T之间隐式转换”
public class Vector3D<T>
{
public T x;
public T y;
public T z;
Vector3D()
{
x = 0;
y = 0;
z = 0;
}
}
答案 0 :(得分: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;
但是,如果您已经知道自己需要Vector
int
并希望为其提供一些附加功能,则可以创建一个设置{{1}的派生类型(这里为T
),以便您以后不必再指定它:
int
答案 1 :(得分:4)
文字0
到T
没有隐式转换。例如,T
可以是string
,也可以是TextField
...
您可能希望将矢量限制为结构类型:
public class Vector3D<T> where T : struct
...但即便如此,您可以拥有Vector3D<DateTime>
,而无法将0转换为DateTime
。但是,您可以使用类型的默认值:
x = default(T);
但是,这已经是每个字段的默认值,因此您根本不需要分配。
此时你仍然可以提出&#34;奇怪&#34;向量(并且你会发现难以对向量执行其他操作,例如将它们乘以标量或将它们相加)但至少它会编译。
你肯定需要这里的通用类型吗?您可能会发现,最终拥有一些特定类型(例如Vector3dInt32
,Vector3dSingle
,Vector3dDouble
)会更高效。我知道它并不优雅,但考虑到&#34; T
没有干净的约束,必须是数字&#34;并且没有简单的方法在T
上执行数字操作,这可能是最实用的解决方案。
您可能还会考虑:
答案 2 :(得分:1)
究竟是什么意思。你有代码“x = 0” - 是一个int常量。但是不保证T是int,所以....这是无效的。没有隐式转换(并且您不会转换为T)。
答案 3 :(得分:0)
使用int类型的值初始化类型T.您不应该为Vector使用泛型类型。像这样^
public class Vector3D
{
public int x;
public int y;
public int z;
Vector3D()
{
x = 0;
y = 0;
z = 0;
}
}
答案 4 :(得分:0)
编译器不知道T可以是int,因此它会给你隐式错误。你可以输入cast it,但问题是你真的需要一个Generic类吗?或只是一个int并说浮动?