簡體   English   中英

將Type類型轉換為Generic數組?

[英]Casting Type array to Generic array?

問題的簡短版本 - 為什么我不能這樣做? 我只限於.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<T>
{
    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 T X
    {
        get { return _axes[0];}
        set { _axes[0] = value; }
    }

    public T Y
    {
        get { return _axes[1]; }
        set { _axes[1] = value; }
    }

    public T Z
    {
        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<T>(Vector2 vector2)
    {
        Vector<T> vector = new Vector<T>(vector2);

        return vector;
    }

    public static explicit operator Vector<T>(Vector3 vector3)
    {
        Vector<T> vector = new Vector<T>(vector3);

        return vector;
    }
    #endregion
}

“通用”表示“適用於任何類型”。

您的示例代碼不是通用的,因為它僅在Tfloat時才有效。


雖然您無法將Vector2D轉換為Vector <T&gt,但您當然可以將Vector2D轉換為Vector <float>。 Convert方法添加到Vector2D或提供一組擴展方法,如下所示:

public static class VectorExtensions
{
    public static Vector<float> ToGenericVector(this Vector2D vector)
    {
        return new Vector<float>(vector.X, vector.Y);
    }

    public static Vector2D ToVector2D(this Vector<float> vector)
    {
        return new Vector2D(vector.X, vector.Y);
    }
}

用法:

Vector<float> v = new Vector<float>(3, 5);

Vector2D v2 = v.ToVector2D();

如果T被定義為float,則通過Vector<T>作為Vector<float>然后這將起作用(在受限制的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 };

您不能在方法中暗示泛型參數的類型。

而且,正如我之前所說,您發布的代碼並不代表Generic類型參數的有效用法。

泛型參數將在類或方法簽名中定義。

public class Class1<T>
{
    public T[] Method(params T[] args)
    {
        return args;
    }
}

public class Demo
{
    public Demo()
    {
        var c1 = new Class1<float>();
        float[] result = c1.Method(1.1f, 2.2f);
    }
}

你說:

 // This doesn't work this._axes = new T[2] { vector2.x, vector2.y }; 

以下工作(因為所有內容都可以轉換為object ,並且允許從objectT的后續轉換,但如果類型不兼容,則可能在運行時失敗,或者在這種情況下,如果無法執行取消裝箱):

this._axes = new T[2] { (T)(object)vector2.x, (T)(object)vector2.y };

也就是說,使類通用是完全沒有意義的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM