일반 유형의 다음 방법이 있습니다.
T GetValue<T>();
T를 int, string, float와 같은 기본 유형으로 제한하고 싶지만 클래스 유형은 아닙니다. 다음과 같이 클래스 유형에 대한 제네릭을 정의 할 수 있습니다.
C GetObject<C>() where C: class;
기본 유형에 대해 가능한지, 가능한지 확실하지 않습니다.
일반 유형의 다음 방법이 있습니다.
T GetValue<T>();
T를 int, string, float와 같은 기본 유형으로 제한하고 싶지만 클래스 유형은 아닙니다. 다음과 같이 클래스 유형에 대한 제네릭을 정의 할 수 있습니다.
C GetObject<C>() where C: class;
기본 유형에 대해 가능한지, 가능한지 확실하지 않습니다.
답변:
이를 사용하여 값 유형으로 제한 할 수 있습니다.
where C: struct
또한 문자열을 언급합니다. 불행히도 문자열은 값 유형이 아니므로 허용되지 않습니다.
n1 + n2
으로 n1과 n2가 모두 유형 C
인 곳 을 수행하는 메서드가 있으면 오류가 발생합니다.Operator '+' cannot be applied to operands of type 'C' and 'C'
실제로 이것은 특정 범위까지 작업을 수행합니다.
public T Object<T>() where T :
struct, IComparable, IFormattable, IConvertible, IComparable<T>, IEquatable<T>
숫자 유형으로 제한하려면 ValueType 클래스에 대해 정의 된 다음 샘플에 대한 유용한 힌트를 얻을 수 있습니다.
IConvertible
인터페이스를 지원하지 않으므로 제거 할 수 있습니다.
찾고있는 내용은 다음과 같습니다.
T GetObject<T>() where T : struct;
struct
요구 사항 을 충족하기 위해 동적으로 검색된 개체를 캐스팅 할 수있는 방법 이 없습니까?
그 세트와 깔끔하게 일치하는 일반적인 제약은 없습니다. 실제로하고 싶은 것은 무엇입니까? 예를 들어, 정적 ctor (제네릭 유형의 경우-제네릭 메서드의 경우 그렇게 쉽지 않음)와 같은 런타임 검사로 해킹 할 수 있습니다.
하나; 대부분의 경우 사람들이 다음 중 하나를 원하기 때문입니다.
방법에서 실제로하려는 것은 무엇입니까? 실제로 IComparable 또는 다른 인터페이스를 구현하려면 C가 필요할 수 있습니다. 어떤 경우에 당신은
T GetObject<T> where T: IComparable
int
,float
등을하지Int32
,Int64
,Single
등 비록class
의미의 Ref 형, "하지만, 클래스 타입이 아닌"관리되지 않는 관리 프리미티브 사이의 구별을 제안한다.