2012-07-13 4 views
5

내 함수에서는 문자열과 Type을 T로 전달해야합니다. T를 기반으로 문자열 val을 해당 유형으로 구문 분석하려고하지만 제목에서 오류가 발생합니다. 이 질문. 어떤 통찰력이나이 기능을 수행하는 다른 방법이있는 사람이라면 크게 감사하겠습니다.제약 조건은 'System.Object'특수 클래스가 될 수 없습니다.

T Parse<T>(string val) where T : System.Object 
    { 
     TypeCode code = Type.GetTypeCode(typeof(T)); 
     switch (code) 
     { 
      case TypeCode.Boolean: 
       return System.Boolean.Parse(val); 
       break; 
      case TypeCode.Int32: 
       return Int32.Parse(val); 
       break; 
      case TypeCode.Double: 
       return Double.Parse(val); 
       break; 
      case TypeCode.String: 
       return (string)val; 
       break; 
     } 
     return null; 
    } 
+3

무엇 거기서하는 것은 남용 제네릭이 있습니다. 유형을 확인하려면 generics를 사용하는 이유는 무엇입니까? – Oded

+0

가능한 복제본 [C# Generics : Constraining T 여기서 T : Object가 컴파일되지 않습니다. 오류 : 제약 조건을 'object'특수 클래스 수 없습니다.] (http://stackoverflow.com/questions/10644703/c-sharp-generics-constraining-t-where-t-object-doesnt-compile-error-constr) – nawfal

답변

15

where T : System.Object 만 제거하면됩니다. 진술에 의해

:

where T : System.Object 

당신은 당신의 방법 Parse에서 T 사용할 수있는 유형의 객체로부터 상속해야한다는 것입니다.
그러나 C#의 모든 객체는 System.Object에서 상속되므로이 제약 조건이 필요하지 않습니다. 컴파일러가 허용하지 않는 이유 중 하나 일 수 있습니다. 또한

, 당신은 null을 반환하고 있기 때문에, 당신이 그렇게, 참조 형식으로 유형 T을 제약 조건해야

where T: class 

을하지만이 방법으로 당신이 어떤 값 부울, 정수 또는 반환 할 수 없습니다 유형.

그러나 코드가 기본적으로 Convert.ChangeType의 기능을 모방, 유일한 차이점은 대신 객체의 정확한 유형을 반환하는 제네릭을 사용하고 있는지,하지만이 기본적으로 동일하다 : 당신이

T Parse<T>(string val) 
{ 
    return (T)Convert.ChangeType(val,typeof(T)); 
} 
+0

검색된 다른 문제가 있지만 내 문제를 해결 한이 응답을 발견했습니다. –

관련 문제