2014-11-25 4 views
0

내 코드 나 오류가 말한다 정확히 무엇을C# 제네릭을 사용하는 것이 잘못된 이유는 무엇입니까?

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

하게 고려할 것 public 필드를 사용하지 않는 것 : 유형의 어, 당신은 절대적으로 선언 할 수있는 필드를 'T'. 하지만 '0'에서 'T'로 변환 할 수는 없습니다. –

+0

생성자 부분을 제거하면 모두 괜찮습니다 ... 선언 할 때 이니셜 라이저를 사용합니다. –

+0

@JonSkeet 그래, 내가 말하려고하는 것은 컴파일러가이 필드가 어떤 타입인지 알고 있어야하고, '0'에서 'T'까지의 암묵적인 대화가 있는지를 알아야하기 때문에 OP는 'T'에서 '0'을 사용할 수 없다는 것이다. '타입? –

답변

1

"을 암시 INT와 T 사이에서 변환 할 수 없습니다"제공합니다. "x = 0"같은 코드가 있습니다. int 상수입니다. 하지만 T가 int라는 보장은 없으므로 ... 유효하지 않습니다. 암시 적 변환은 없으며 T로 변환하지 않습니다.

9

유일한 잘못된 것은 생성자의 속성에 값을 할당하는 것입니다. T 유형을 지정하고 클래스 인스턴스를 작성할 때까지 알 수 없기 때문에이 작업을 수행 할 수 없습니다. 컴파일러가 아직 사용 유형을 모르는 당신이 그것을 할 방법 :

public class Vector3D<T> 
{   
    public T x; 
    public T y; 
    public T z;   
} 

T 의미 : 당신이 클래스를 인스턴스화 할 때 나중에 여기에 뭔가 콘크리트를 사용할 수 있습니다. 당신은 이미 당신이 int s의 Vector 필요합니다 알고 경우

var vector = new Vector3D<int>(); 
vector.x = 0; 
vector.y = 0; 
vector.z = 0; 

당신이 제공 할 : int의와 예를 들어

:

var vector = new Vector3D<int>() 
{ 
    x = 0, 
    y = 0, 
    z = 0 
}; // I'm using the object initializer here. 

은 그것과 동일 여기에 몇 가지 추가 기능을 추가하여 나중에 다시 지정할 필요가 없도록 T (여기에서 int)으로 설정하는 파생 형식을 만들 수 있습니다.

public class Int32Vector3D : Vector3D<Int32> 
{ 
    public Int32Vector3D() 
    { 
     x = 0; 
     y = 0; 
     z = 0; 
    } 

    // custom members for adding, subtracting, translating etc. 
} 
+0

좋은 답변입니다. 아마도'Vector3D '의 기본값으로'default (T)'를 추가 할 수 있습니다. 'int'의 경우'0', 인스턴스의 경우'null'이 주어집니다. –

0

int 형식의 값을 사용하여 형식 T를 초기화합니다. Vector에 제네릭 형식을 사용하면 안됩니다. 이처럼^

public class Vector3D 
{ 
    public int x; 
    public int y; 
    public int z; 

    Vector3D() 
    { 
     x = 0; 
     y = 0; 
     z = 0; 
    } 
} 
0

컴파일러는 T가 int 일 수 있음을 알지 못하므로 암시 적 오류가 발생합니다. 캐스트를 입력 할 수 있습니다. 그러나이 질문에 대해서는 일반 클래스가 필요합니까? 또는 단지 int와 float라고할까요?

4

글자 0에서 T까지 암시 적 변환을 사용할 수 없습니다. 예를 들어, Tstring, 또는 TextField ... 당신은 잘 유형의 구조체하기 위해 벡터를 제한 할 수 있습니다

수 :

public class Vector3D<T> where T : struct 

을 ...하지만 그렇다고하더라도, 당신은 Vector3D<DateTime>있을 수 있고, 0을 DateTime으로 변환 할 수 없습니다.

x = default(T); 

하지만, 그건 이미 각 필드의 기본값입니다, 그래서 당신은 모든 할당이 필요하지 않습니다 : 당신은, 그러나, 유형에 대한 기본 값을 사용할 수 있습니다.

그 시점에서 "이상한"벡터가 나타날 수 있습니다 (벡터에 스칼라를 곱하거나 추가하는 것과 같이 벡터에서 다른 연산을 수행하는 것이 어렵지 만) 적어도 컴파일 할 것입니다.

확실히 이 필요합니까? 일반 유형은 여기에 있습니까?결과적으로 몇 가지 특정 유형 (예 : Vector3dInt32, Vector3dSingle, Vector3dDouble)을 갖는 것이 더 생산적이라는 것을 알 수 있습니다. 나는 그것이 우아하지 않다는 것을 알고 있지만, "T은 숫자 여야 만합니다"라는 명확한 제한이없고 T에서 숫자 연산을 수행하는 쉬운 방법이 없다는 점을 감안할 때 가장 실용적인 솔루션 일 수 있습니다.

당신은 또한 고려해 볼 수 있습니다 :

  • 당신이 확실히 클래스를 원하십니까, 또는 구조체가 더 적합 할 것인가? (당신이 클래스를 사용해야하는 경우를 밀봉 고려한다.)
  • 나는
  • 난 강력 불변의 유형 SonerGönül @
관련 문제