2011-05-02 4 views
19

나는 나를 인수에 대한 검사를 수행하는 데 도움이 제네릭 클래스는,C 번호 - 정적 유형의 형식 인수로 사용할 수 없습니다

internal sealed class Argument<T> 
    where T : class 
{ 
    private void TraceAndThrow(Exception ex) 
    { 
     new InternalTraceHelper<T>().WriteError(ex); 
     throw ex; 
    } 

    internal void ThrowNull(object value, string argName) 
    { 
     if (ReferenceEquals(value, null)) 
     { 
      TraceAndThrow(new ArgumentNullException(argName)); 
     } 
    } 

    internal void ThrowIf(bool condition, string argName) 
    { 
     if (condition) 
     { 
      TraceAndThrow(new ArgumentException(null, argName)); 
     } 
    } 


    internal void ThrowNotInEnum(Type enumType, object value) 
    { 
     if (!Enum.IsDefined(enumType, value)) 
     { 
      TraceAndThrow(new ArgumentOutOfRangeException(Resources.ArgEnumIllegalVal.InvariantFormat(value))); 
     } 
    } 
} 

값했습니다하지만 정적 클래스와 함께 사용하려고 :

나는 (컴파일시)이 오류가 발생했습니다
internal static class Class1 
{ 
    private static Argument<Class1> _arg; 
} 

:

정적 유형의 형태 인수로 사용할 수 없습니다

내가 뭘 잘못하고있어?

답변

24

이것은 의도적이다.

정적 클래스는 부적절한 사용을 방지하기 위해 거의 모든 상황에서 ... 인스턴스이 필요하고 유형 인수가 포함 된 상황에서는 사용할 수 없습니다.

정적 클래스 유형을 참조 할 수있는 매우 제한된 상황에 대해서는 C# 4 spec의 10.1.1.3.1 절을 참조하십시오.

+0

고정 클래스가 아닌 정적 클래스를 수행하지만 개인 생성자를 사용하면 작업이 수행됩니까? 아무도 그것을 instanciate 수 있지만 정적이 아닙니다. 이것을 수행하는 좋은 방법입니까? (이 부분을 읽어 주셔서 감사합니다.) –

+0

@Arnaud F : 글쎄, * 작동합니다 * -하지만 형식 인수는 무엇을 사용하고 있습니까? 그게 무슨 말이야? 'InternalTraceHelper'에 의해서만 사용 된 것처럼 보입니다. 우리는 그것이 무엇인지 알지 못합니다. –

+0

'InternalTraceHelper'는'Trace.Write()'를하고, 인자 타입은 트레이스의 카테고리를 정의하는데 사용됩니다. 'Trace.WriteLine ("message", typeof (T) .FullName);로 대체 될 수 있습니다. // Where T = Class1' –

5

제네릭은 정적 클래스가 아닌 인스턴스에서만 작동합니다.

+0

해결 방법이 있습니까? 어떻게 관리 할 수 ​​있습니까? 나는 정적 클래스에서 "수동으로"체크하지 않고 정적이 아닌 클래스에서'Argument '를 사용합니다 ... –

+0

아니요 'System.Type'을 사용하는 것이 아닙니다. –

+0

@Arnaud, 정적 형식을 인수로 전달할 수 없으므로 클래스 이름에 속지 않는 한'Argument '을 사용하고 싶지 않습니다. –

-1

무엇을 잘못하고있는 것은 제네릭 형식 인수로 정적 형식을 사용하고 있습니다.

1

정적 클래스는 인스턴스화 할 수 없으므로 고정 유형의 Argument<T>을 만들 수 없습니다.

0

정적 클래스에는 인스턴스 멤버가 없으므로 내 관심사는 내가 그들과 어떤 관계가 있는지에 관한 것입니다.

정적 클래스를 제네릭 인수로 사용할 수 없다는 사실을 알지 못했지만 제네릭 클래스 대신 확장 메서드를 사용해야한다고 생각합니다.

관련 문제