将类型数组转换为通用数组?
问题的简短版本 – 为什么我不能这样做? 我只限于.NET 3.5。
T[] genericArray; // Obviously T should be float! genericArray = new T[3]{ 1.0f, 2.0f, 0.0f }; // Can't do this either, why the hell not genericArray = new float[3]{ 1.0f, 2.0f, 0.0f };
更长的版本 –
我在这里使用Unity引擎,虽然这并不重要。 是什么 – 我试图在其固定的Vector2(2个浮点数)和Vector3(3个浮点数)和我的通用Vector 类之间进行转换。 我无法将类型直接转换为通用数组。
using UnityEngine; public struct Vector { private readonly T[] _axes; #region Constructors public Vector(int axisCount) { this._axes = new T[axisCount]; } public Vector(T x, T y) { this._axes = new T[2] { x, y }; } public Vector(T x, T y, T z) { this._axes = new T[3]{x, y, z}; } public Vector(Vector2 vector2) { // This doesn't work this._axes = new T[2] { vector2.x, vector2.y }; } public Vector(Vector3 vector3) { // Nor does this this._axes = new T[3] { vector3.x, vector3.y, vector3.z }; } #endregion #region Properties public T this[int i] { get { return _axes[i]; } set { _axes[i] = value; } } public TX { get { return _axes[0];} set { _axes[0] = value; } } public TY { get { return _axes[1]; } set { _axes[1] = value; } } public TZ { get { return this._axes.Length < 2 ? default(T) : _axes[2]; } set { if (this._axes.Length < 2) return; _axes[2] = value; } } #endregion #region Type Converters public static explicit operator Vector(Vector2 vector2) { Vector vector = new Vector(vector2); return vector; } public static explicit operator Vector(Vector3 vector3) { Vector vector = new Vector(vector3); return vector; } #endregion }
“通用”表示“适用于任何类型”。
您的示例代码不是通用的,因为它仅在T
是float
时才有效。
虽然您无法将Vector2D转换为Vector Convert
方法添加到Vector2D或提供一组扩展方法,如下所示:
public static class VectorExtensions { public static Vector ToGenericVector(this Vector2D vector) { return new Vector (vector.X, vector.Y); } public static Vector2D ToVector2D(this Vector vector) { return new Vector2D(vector.X, vector.Y); } }
用法:
Vector v = new Vector (3, 5); Vector2D v2 = v.ToVector2D();
如果T被定义为float,则通过Vector
作为Vector
然后这将工作(在受限制的T上),但是如果你只想要一个本地转换:
var genericArray = new float[3]{ 1.0f, 2.0f, 0.0f };
当然,这会将T限制为浮点数(编译器无法将任何东西转换为T并且知道这一点),看起来你应该在整个类中用float替换T,如果是这样的话,你在处理非-float载体?
在这种情况下,您需要以下内容:
var genericArray = new T[3]{ X, Y, Z };
您不能在方法中暗示generics参数的类型。
而且,正如我之前所说,您发布的代码并不代表Generic类型参数的有效用法。
generics参数将在类或方法签名中定义。
public class Class1 { public T[] Method(params T[] args) { return args; } } public class Demo { public Demo() { var c1 = new Class1(); float[] result = c1.Method(1.1f, 2.2f); } }
你说:
// This doesn't work this._axes = new T[2] { vector2.x, vector2.y };
以下工作(因为所有内容都可以转换为object
,并且允许从object
到T
的后续转换,但如果类型不兼容,则可能在运行时失败,或者在这种情况下,如果无法执行拆箱):
this._axes = new T[2] { (T)(object)vector2.x, (T)(object)vector2.y };
也就是说,使类成为通用是完全没有意义的。
上述就是C#学习教程:将类型数组转换为通用数组?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/949496.html