2010-03-28 5 views
3

질문의 짧은 버전 - 왜 이것을 할 수 없습니까? .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 }; 

더 긴 버전 - 그건 중요하지 않지만

나는 여기 유니티 엔진으로 일하고 있어요. 무엇이 - 고정 된 Vector2 (2 개 부동)와 Vector3 (3 개 부동) 사이에 변환을 던지려는 중입니다. 제 일반 벡터 <> 클래스입니다. 유형을 일반 배열로 직접 형 변환 할 수 없습니다. T는 Vector<float>Vector<T>를 통해, float로서 정의 된 경우

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 
} 
+3

수업이 완료되지 않았습니다. 일반 매개 변수가 표시되지 않습니다. 불완전한 코드는 코드가없는 것보다 나쁩니다. ;-) –

+0

@Sky 코드가 완료되었지만 George가 HTML을 제대로 벗어나지 못했습니다 (''...). –

+0

@Konrad & George. 그래, 알아 냈어 야 했어. 죄송합니다. –

답변

2

"일반"수단 "어떤 유형 작동":이 경우

당신이 뭔가를해야합니다.

예제 코드는 Tfloat 인 경우에만 작동하기 때문에 일반적인 코드는 아닙니다. 당신이 벡터 < T &한다에 Vector2D을 변환 할 수는 없지만


, 당신은 물론, >을 떠 < 벡터에 Vector2D을 변환 할 수 있습니다. 이 같은 확장 메소드 세트를 Vector2D에 Convert 방법을 추가 제공 :

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(); 
+0

짧은 버전, 예. 그러나 전체적인 생각은 Vector 이 무엇이든 될 수 있다는 것입니다. int, float, double에 사용했습니다. Unity는 Vector2와 Vector3 타입을 가지고 있으며, 변환 할 수 있기를 원합니다. 그래서 나는 훨씬 우수한 generic 버전을 처리 할 수 ​​있습니다. 그러나 어떤 Unity 함수도 고정 된 타입으로 피드 할 수 있습니다. 예 : 벡터 v = 새 벡터 (3); 벡터 3 v3 = v; –

+0

Excellent - thankyou! –

1

는 다음이 (제한된 T에) 작동하지만 것이다 당신은 로컬 변환하려면 : 물론

var genericArray = new float[3]{ 1.0f, 2.0f, 0.0f }; 

이 제한합니다을 T는 어쨌든 플로트가됩니다 (컴파일러는 T를 무엇이든 변환 할 수없고 이것을 알고 있습니다), 전체 클래스에서 T를 float로 대체해야하는 것처럼 보입니다. 플로트가 아닌 벡터를 다루고 있습니까?

var genericArray = new T[3]{ X, Y, Z }; 
1

당신은 방법 내에서 일반적인 매개 변수의 유형을 암시하지 않습니다.

앞에서 설명한 것처럼 게시 된 코드는 일반 유형 매개 변수의 유효한 사용을 나타내지 않습니다.

제네릭 매개 변수는 클래스 또는 메서드 서명에 정의됩니다.

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); 
    } 
} 
+0

위의 코멘트를 참조하십시오. –

0

당신은 말했다 :

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

다음 작품

(모든 것이 object로 변환 할 수 있으며, T- object에서 이후의 변환은 허용되지만 경우 런타임에 실패 할 수 있기 때문에 유형이 호환되지 않거나이 경우 언 박싱을 수행 할 수없는 경우) :

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

즉, 클래스를 포괄적으로 만드는 것은 전혀 의미가 없습니다.

관련 문제