我使用C#泛型有什么问题?

时间:2014-11-25 07:08:44

标签: c# vector graphics 3d

我的代码给了我错误“无法在int和T之间隐式转换”

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

5 个答案:

答案 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)

文字0T没有隐式转换。例如,T可以是string,也可以是TextField ...

您可能希望将矢量限制为结构类型:

public class Vector3D<T> where T : struct

...但即便如此,您可以拥有Vector3D<DateTime>,而无法将0转换为DateTime。但是,您可以使用类型的默认值:

x = default(T);

但是,这已经是每个字段的默认值,因此您根本不需要分配。

此时你仍然可以提出&#34;奇怪&#34;向量(并且你会发现难以对向量执行其他操作,例如将它们乘以标量或将它们相加)但至少它会编译。

你肯定需要这里的通用类型吗?您可能会发现,最终拥有一些特定类型(例如Vector3dInt32Vector3dSingleVector3dDouble)会更高效。我知道它并不优雅,但考虑到&#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并说浮动?