Programing

C # 제네릭 오류에 대한 도움말- " 'T'형식은 nullable이 아닌 값 형식이어야합니다."

lottogame 2020. 8. 26. 08:22
반응형

C # 제네릭 오류에 대한 도움말- " 'T'형식은 nullable이 아닌 값 형식이어야합니다."


저는 C #을 처음 사용하고 다음 코드가 작동하지 않는 이유를 이해하지 못합니다.

public static Nullable<T> CoalesceMax<T>(Nullable<T> a, Nullable<T> b) where T : IComparable
{
    if (a.HasValue && b.HasValue)
        return a.Value.CompareTo(b.Value) < 0 ? b : a;
    else if (a.HasValue)
        return a;
    else
        return b;
}

// Sample usage:
public DateTime? CalculateDate(DataRow row)
{
    DateTime? result = null;
    if (!(row["EXPIRATION_DATE"] is DBNull))
        result = DateTime.Parse((string)row["EXPIRATION_DATE"]);
    if (!(row["SHIPPING_DATE"] is DBNull))
        result = CoalesceMax(
            result
            DateTime.Parse((string)row["SHIPPING_DATE"]).AddYears(1));
    // etc.
    return result;
}

컴파일 중에 다음 오류가 발생합니다.

제네릭 형식 또는 메서드 'System.Nullable <T>'에서 매개 변수 'T'로 사용하려면 'T'형식이 nullable이 아닌 값 형식이어야합니다.

T : struct제약 조건 을 추가해야합니다 .

public static Nullable<T> CoalesceMax<T>
    (Nullable<T> a, Nullable<T> b) where T : struct, IComparable

그렇지 않으면 C #은 Nullable<T>의미 를 파악하려고 시도 하고 Nullable<T>자체적으로 필요한 제약 조건이 아직 없다는 것을 인식 합니다. 즉, 다음을 호출 할 수 있습니다.

CoalesceMax<string>(...)

타당하지 않기 때문에 말이 Nullable<string>되지 않습니다.


Nullable<T>유형 필요 그것에 제한 갖는다 T(값 유형으로 structC 번호하여). 이것이 컴파일러가 Nullable<T>함수 나 해당 함수의 호출 사이트가 아니라 사용자 에게 알려주 Nullable는 이유입니다. 오류의 근본 원인 인 클래스이므로 컴파일러가 함수를 가리키고 다음과 같이 말한 경우 실제로 더 유용합니다. "이건 옳지 않아, 고쳐!" ( CoalesceMax여러 제네릭을 사용하고 그중 하나에 대한 제약 조건을 위반했다고 상상해보십시오. 하나 이상의 제약 조건이 깨 졌다는 것을 아는 것보다 제약 조건이 깨진 제네릭을 아는 것이 더 유용합니다 CoalesceMax).

해결책은 동일한 제약을 도입하여 귀하 T와 이들의 T호환성 을 만드는 것 입니다. 이는 struct모든 인터페이스 / 새 제약 조건 앞에 와야 하는 제약 조건 을 추가하여 수행됩니다 .

public static Nullable<T> CoalesceMax<T>(Nullable<T> a, Nullable<T> b) where T : struct, IComparable{
  ...
}

일반적인 방법은 Nullable<T>.

그러나 유형을 제한하지 않으므로 , 이는 분명히 유효하지 않은으로 T끝날 수 Nullable<Form>있습니다.

값 유형 만 될 수 where T : struct, IComparable있도록 제한 조건을로 변경해야 T합니다.


OP에 대한 정확한 대답은 아니지만 이것이 동일한 오류 메시지에 대해 Google에서 가장 먼저 나타나는 것이기 때문에 내 메서드가 아닌 클래스 정의에 제약 조건을 추가해야했습니다.

public class MyClass<T> where T : struct
{
    public void MyMethod(T? value)
    {
    }
}

참고URL : https://stackoverflow.com/questions/2230657/help-with-c-sharp-generics-error-the-type-t-must-be-a-non-nullable-value-ty

반응형