2014-12-02 7 views
2

null, empty, 또는 null 요소이 포함 된 에 대한 수집 매개 변수를 확인하는 일반 인수 유효성 검사 메서드를 만들려고합니다. T는 nullable 형식되지 않을 수 있기 때문에 "nullable types 컬렉션"이라는 제약 조건을 어떻게 지정합니까?

public void Foo(ICollection<MyType> bar) { // Validate parameters ThrowIfNullEmptyOrContainsNull(bar, "bar"); . . . 

난 단지 유형 제약에서 ICollection<T>을 지정하면

if (value.Contains(null))는 오류가 발생합니다.

내가 무엇을 최대 온,하지만 잘 될 것 같지 않습니다

internal static T1 ThrowIfNullEmptyOrContainsNull<T1, T2>(T1 value, string name) 
    where T1 : ICollection<T2> 
    where T2 : class 
{ 
    if (ReferenceEquals(value, null)) 
     throw new ArgumentNullException(name); 

    if (value.Count == 0) 
     throw new ArgumentException("Empty collection not allowed", name); 

    if (value.Contains(null)) 
     throw new ArgumentException("Collection contains one or more null elements", name); 

    return value; 
} 

을 ...하지만 난 명시 적 인수 형식이 같은 뭔가 메소드를 호출 할 수 있습니다

public void Foo(ICollection<MyType> bar) 
{ 
    // Validate parameters 
    ThrowIfNullEmptyOrContainsNull<(ICollection<MyType>, MyType>(bar, "bar"); 
        . 
        . 
        . 

통화에 명시 적으로 T1과 T2를 지정하지 않으면 "형식 인수가 사용법에서 유추되지 않습니다"라는 오류 메시지가 나타납니다.

누구든지이 작업을 수행하는 방법을 밝힐 수 있습니까?

+0

질문 제목을 본문과 일치시킬 수 없습니다. 작업/문제를 좀 더 명확히해볼 수 있습니까? –

+1

@usr 아니요, 그는 T1이 필요합니다. 그가 가지고 있지 않다면 그는이 메소드를 호출 할 때 리턴 된 값을 추방 할 것입니다. – Servy

+1

질문에 답을 얻지 못하는 두 가지 가능한 접근법이 있습니다. 컬렉션이 모두 비 제너릭 ICollection을 구현하는 경우이를 대신 사용하고 제약 조건을 잊어 버릴 수 있습니다. 'ICollection '에'null '이 포함되어 있다고 불평하는 일은 결코 없을 것입니다. 그 외에도 메소드를 오버로드하여 참조 유형에 대해 하나의 메소드를 가질 수 있고 널값 유형에 대해 하나의 다른 메소드 (동일한 이름을 가짐)를 가질 수 있습니다. – hvd

답변