내 코드 나 오류가 말한다 정확히 무엇을C# 제네릭을 사용하는 것이 잘못된 이유는 무엇입니까?
public class Vector3D<T>
{
public T x;
public T y;
public T z;
Vector3D()
{
x = 0;
y = 0;
z = 0;
}
}
내 코드 나 오류가 말한다 정확히 무엇을C# 제네릭을 사용하는 것이 잘못된 이유는 무엇입니까?
public class Vector3D<T>
{
public T x;
public T y;
public T z;
Vector3D()
{
x = 0;
y = 0;
z = 0;
}
}
"을 암시 INT와 T 사이에서 변환 할 수 없습니다"제공합니다. "x = 0"같은 코드가 있습니다. int 상수입니다. 하지만 T가 int라는 보장은 없으므로 ... 유효하지 않습니다. 암시 적 변환은 없으며 T로 변환하지 않습니다.
유일한 잘못된 것은 생성자의 속성에 값을 할당하는 것입니다. 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.
}
좋은 답변입니다. 아마도'Vector3D
int 형식의 값을 사용하여 형식 T를 초기화합니다. Vector에 제네릭 형식을 사용하면 안됩니다. 이처럼^
public class Vector3D
{
public int x;
public int y;
public int z;
Vector3D()
{
x = 0;
y = 0;
z = 0;
}
}
컴파일러는 T가 int 일 수 있음을 알지 못하므로 암시 적 오류가 발생합니다. 캐스트를 입력 할 수 있습니다. 그러나이 질문에 대해서는 일반 클래스가 필요합니까? 또는 단지 int와 float라고할까요?
글자 0
에서 T
까지 암시 적 변환을 사용할 수 없습니다. 예를 들어, T
는 string
, 또는 TextField
... 당신은 잘 유형의 구조체하기 위해 벡터를 제한 할 수 있습니다
수 :
public class Vector3D<T> where T : struct
을 ...하지만 그렇다고하더라도, 당신은 Vector3D<DateTime>
있을 수 있고, 0을 DateTime
으로 변환 할 수 없습니다.
x = default(T);
하지만, 그건 이미 각 필드의 기본값입니다, 그래서 당신은 모든 할당이 필요하지 않습니다 : 당신은, 그러나, 유형에 대한 기본 값을 사용할 수 있습니다.
그 시점에서 "이상한"벡터가 나타날 수 있습니다 (벡터에 스칼라를 곱하거나 추가하는 것과 같이 벡터에서 다른 연산을 수행하는 것이 어렵지 만) 적어도 컴파일 할 것입니다.
확실히 이 필요합니까? 일반 유형은 여기에 있습니까?결과적으로 몇 가지 특정 유형 (예 : Vector3dInt32
, Vector3dSingle
, Vector3dDouble
)을 갖는 것이 더 생산적이라는 것을 알 수 있습니다. 나는 그것이 우아하지 않다는 것을 알고 있지만, "T
은 숫자 여야 만합니다"라는 명확한 제한이없고 T
에서 숫자 연산을 수행하는 쉬운 방법이 없다는 점을 감안할 때 가장 실용적인 솔루션 일 수 있습니다.
당신은 또한 고려해 볼 수 있습니다 :
하게 고려할 것 public 필드를 사용하지 않는 것 : 유형의 어, 당신은 절대적으로 선언 할 수있는 필드를 'T'. 하지만 '0'에서 'T'로 변환 할 수는 없습니다. –
생성자 부분을 제거하면 모두 괜찮습니다 ... 선언 할 때 이니셜 라이저를 사용합니다. –
@JonSkeet 그래, 내가 말하려고하는 것은 컴파일러가이 필드가 어떤 타입인지 알고 있어야하고, '0'에서 'T'까지의 암묵적인 대화가 있는지를 알아야하기 때문에 OP는 'T'에서 '0'을 사용할 수 없다는 것이다. '타입? –