기본 유형에 대한 일반 유형 제한을 정의하는 방법은 무엇입니까?


81

일반 유형의 다음 방법이 있습니다.

T GetValue<T>();

T를 int, string, float와 같은 기본 유형으로 제한하고 싶지만 클래스 유형은 아닙니다. 다음과 같이 클래스 유형에 대한 제네릭을 정의 할 수 있습니다.

C GetObject<C>() where C: class;

기본 유형에 대해 가능한지, 가능한지 확실하지 않습니다.


나는 David.Chu.ca @ "기본 형식"에 의해, 즉 관리되지 않는 형식, 의미 있다고 생각 int, float등을하지 Int32, Int64, Single등 비록 class의미의 Ref 형, "하지만, 클래스 타입이 아닌"관리되지 않는 관리 프리미티브 사이의 구별을 제안한다.
mireazma

답변:


50

이를 사용하여 값 유형으로 제한 할 수 있습니다.

where C: struct

또한 문자열을 언급합니다. 불행히도 문자열은 값 유형이 아니므로 허용되지 않습니다.


2
하지만 문자열을 널 (NULL) 인
David.Chu.ca

5
물론 기본 유형뿐만 아니라 사용자 정의 구조체 유형도 전달할 수 있습니다. 모든 내장 기본 유형에 대해 오버로드를 정의하는 것 외에 다른 방법이 있는지 잘 모르겠습니다.
Matt Hamilton

1
질문은 값 유형이 아니라 원시에 대한 것이 었습니다. 답변에서 언급했듯이 문자열 프리미티브는 값 유형이 아니므로 그 점에서 작동하지 않습니다. 또한 프리미티브가 아닌 임의의 구조체 (@MattHamilton 지적)를 전달할 수 있습니다.
BrainSlugs83

1
이것 n1 + n2으로 n1과 n2가 모두 유형 C인 곳 을 수행하는 메서드가 있으면 오류가 발생합니다.Operator '+' cannot be applied to operands of type 'C' and 'C'
Sisir

25

실제로 이것은 특정 범위까지 작업을 수행합니다.

public T Object<T>() where T :
   struct, IComparable, IFormattable, IConvertible, IComparable<T>, IEquatable<T>

숫자 유형으로 제한하려면 ValueType 클래스에 대해 정의 된 다음 샘플에 대한 유용한 힌트를 얻을 수 있습니다.


참고 : 이를 사용하여 데이터베이스에 ID 필드를 공급하는 경우, 나와 마찬가지로 Guid 구조체는 IConvertible인터페이스를 지원하지 않으므로 제거 할 수 있습니다.
deadManN

15

찾고있는 내용은 다음과 같습니다.

T GetObject<T>() where T : struct;

젠장! 나는 누군가가 나를 때리는 것이 싫어. 좋은 BFree!
Joshua Belden

1
어떻게 원시하지만 nullable 형식입니다 문자열에 대한
David.Chu.ca

4
@David : 문자열은 기본 유형이 아닙니다. 일부 경우 기본 유형으로 취급되는 참조 유형입니다.
Samuel

하지만 해당 struct요구 사항 을 충족하기 위해 동적으로 검색된 개체를 캐스팅 할 수있는 방법 이 없습니까?
Nyerguds 2018

1
문자열은 기본이지만 구조체 / 값 유형이 아닙니다.
BrainSlugs83

11

그 세트와 깔끔하게 일치하는 일반적인 제약은 없습니다. 실제로하고 싶은 것은 무엇입니까? 예를 들어, 정적 ctor (제네릭 유형의 경우-제네릭 메서드의 경우 그렇게 쉽지 않음)와 같은 런타임 검사로 해킹 할 수 있습니다.

하나; 대부분의 경우 사람들이 다음 중 하나를 원하기 때문입니다.

  • 항목이 동일한 지 확인할 수 있습니다.이 경우 사용 EqualityComparer<T>.Default
  • 항목을 비교 / 정렬 할 수 있도록 : 어떤 경우에 사용 Comparer<T>.Default
  • 산술을 수행 할 수 있도록 :이 경우 일반 연산자에 대한 MiscUtil 지원을 사용합니다.


7

방법에서 실제로하려는 것은 무엇입니까? 실제로 IComparable 또는 다른 인터페이스를 구현하려면 C가 필요할 수 있습니다. 어떤 경우에 당신은

T GetObject<T> where T: IComparable
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.