2

'int'유형으로 제한된 제네릭 메소드가있는 경우 확실하게 일반 T 유형으로 정수를 캐스팅 할 수 있어야합니다. 예를 들면 ...

    public T ExampleMethod<T>(int unchanged) where T : int
    {
        return (T)unchanged;
    }

... 컴파일러가 불평합니다.'int'유형을 'T'로 변환 할 수 없습니다.하지만 대상이 정수임을 나타내는 제약이 있습니다. 그럼 분명히 효과가 있을까요?

최신 정보:

실제 시나리오는 enum 값을 반환하는 도우미 메서드가 필요하다는 것입니다. 그래서 제 이상적인 도우미 방법이 더 좋아질 것입니다 ....

public T GetAttributeAsEnum<T>(XmlReader reader, string name) where T : enum
{
    string s = reader.GetAttribute(name);
    int i = int.Parse(s);
    return (T)i;
}

... 이것을 이렇게 사용하면 ...

StateEnum x = GetAttributeAsEnum<StateEnum>(xmlReader, "State");
CategoryEnum y = GetAttributeAsEnum<CategoryEnum>(xmlReader, "Category");
OtherEnum z = GetAttributeAsEnum<OtherEnum>(xmlReader, "Other");

...하지만 당신은 enum으로 제한 할 수 없습니다.


  • 왜 매개 변수 유형을 다음과 같이 지정해야합니까?T? - gilly3
  • 내 실제 상황은 더욱 복잡합니다. 나는 파일에서 문자열을 읽는 도우미 메서드를 원한다. 문자열은 실제로 숫자이다. 그런 다음 숫자를 올바른 대상 열거 형으로 캐스팅합니다. 그래서... - Phil Wright
  • 이것은 컴파일되지 않습니다. 오류 : ' int ' 유효한 제약 조건이 아닙니다. 제약 조건으로 사용되는 형식은 인터페이스, 비 밀폐 된 클래스 또는 형식 매개 변수 여야합니다. - Adriaan Stander
  • 만약T제네릭을 사용하는 이유는 항상 int입니다. - default locale
  • public T Method (XmlReader reader) T : enum {string s = reader.GetAttribute ( "whatever"); int i = int.Parse (s); return (T) i; } - Phil Wright

3 답변


7

"제약 조건으로 클래스 또는 인터페이스 만 지정할 수 있습니다."(c) ReSharper

int (Int32)는 단지 구조체입니다. 당신은 T가구조체. 하지만 구조체를 제약 조건으로 사용할 수는 없습니다.

여기서 찾을 수있는 가능한 제약 조건의 전체 목록 -http://msdn.microsoft.com/en-us/library/d5x73970.aspx

UPD

Enum 제약 조건은이 질문을 참조하십시오.& quot; 특수 클래스 & quot;의 제네릭 형식 제약 조건에 대한 해결 방법이 있습니까? 열거 형 C # 3.0?


  • 에이구조체또한 제약 조건으로 사용할 수 있습니다. 다음 컴파일 :public class Generic<T> where T : struct { }. 그런 다음 클래스를 다음과 같이 인스턴스화 할 수 있습니다.Generic<int> gen = new Generic<int>();. - Eric J.
  • @EricJ. 이해가 안됩니다. T를 "a struct"로 제한 할 수는 있지만 구조체를 제약 조건으로 사용할 수는 없습니다. - Dmitry Khryukin
  • 네가 어디에서 왔는지 알 겠어. 그것이 그대로, 당신의 대답은 오해의 소지가 있습니다. 너 외에구조체당신은 또한 지정할 수 있습니다새로운제약으로. 이들 중 어느 것도 "클래스 또는 인터페이스"는 아니다. - Eric J.
  • @EricJ. 업데이트되었습니다! 이제는 오해의 소지가 없습니까? - Dmitry Khryukin
  • 이제 나에게 잘 어울려. - Eric J.

4

int(및 다른 모든 숫자 유형 및 열거 형)은 제네릭 제약 조건으로 사용할 수 없습니다.

만나다

일반 C # 코드 및 Plus 연산자

자세한 내용 및 옵션을 확인하십시오.

제네릭과 타입 제약에 관한 C #을 만든 Anders Hejlsberg와의 토론

http://www.artima.com/intv/generics.html

하나의 유형 제약 조건을 넣을 수 있습니다.구조체이렇게 :

public class Generic<T> where T : struct { }

Generic<int> gen = new Generic<int>();


  • 다운 로더:이 답변에 어떤 문제가 있습니까? 우리가 모두 배울 수 있도록 나누십시오. - Eric J.

2

그 컴파일은 확실합니까?

여기에서 다음과 같은 오류가 발생합니다.

오류 CS0701 : 'int'는 (는) 유효한 제약이 아닙니다. 유형으로 사용되는   제약 조건은 인터페이스, 비 밀폐 클래스 또는 유형이어야합니다.   매개 변수.

연결된 질문


관련된 질문

최근 질문