programing

운영자 '??'

yoursource 2021. 1. 16. 10:53
반응형

운영자 '??' 'T'및 'T'유형의 피연산자에는 적용 할 수 없습니다.


다음과 같은 일반적인 방법이 있지만 VS는 그것에 대한 컴파일 오류를 제공합니다. (연산자 '??'는 'T'및 'T'유형의 피연산자에 적용 할 수 없습니다.)

public static T Method<T>(T model) where T : new()
{
    var m = model ?? new T();
}

어떤 사람은 이유를 알고 있습니까?

편집 : 그 이유는 T가 내 경우 구조체가 될 수 있고 구조체가 nullable이 아닌 유형이기 때문일 수 있습니까?


class제약 조건 을 추가해야합니다 .

public static T Method<T>(T model) where T : class, new()
{
    var m = model ?? new T();

    return m;
}

그리고 당신도 돌아와야합니다 m!

참고 :로 @KristofDegrave 그의 코멘트에 언급, 우리는 추가해야하는 이유 classT는 같은 값 형식이 될 수 있기 때문에 제약은 int이후 ??우리가 추가 할 필요가 있으므로, null이 될 수있는 유형에 대한 연산자 (널 병합) 체크 class제약 조건을 값 유형을 제외합니다.

편집 : Alvin Wong의 답변은 nullable 유형의 경우에도 적용되었습니다. 실제로 구조체이지만 ??의 피연산자가 될 수 있습니다. 운영자. nullable 형식에 대해 Alvin의 오버로드 된 버전없이 Method반환 된다는 점에 유의하십시오 null.


??Null 통합 연산자입니다. nullable이 아닌 형식에는 적용 할 수 없습니다. 때문에 T아무것도 할 수있다, 그것은 할 수 있습니다 int또는 다른 원시적 인, 비 - nullable 형식.

조건을 추가하는 경우 where T : class(앞에 지정해야 함 new()) Tnull을 허용하는 클래스 인스턴스가됩니다.


많은 사람들은 class제네릭에 대한 제약을 추가 하면 문제가 해결 될 것이라고 이미 지적했습니다 .

메서드를 적용하려면 Nullable<T>오버로드를 추가 할 수 있습니다.

// For reference types
public static T Method<T>(T model) where T : class, new()
{
    return model ?? new T();
}

// For Nullable<T>
public static T Method<T>(T? model) where T : struct
{
    return model ?? new T(); // OR
    return model ?? default(T);
}

T유형이 제네릭 유형에 대한 제약 조건이있는 클래스 임을 지정해야합니다 .

public static T Method<T>(T model) where T : class, new()
{
    return model ?? new T();
}

T는 모든 유형이 될 수 있으므로 T가 정적 ?? 연산자 또는 유형 T가 nullable인지 여부.

?? 연산자 (C # 참조)

? 연산자는 null 통합 연산자라고하며 nullable 값 형식 또는 참조 형식에 대한 기본값을 정의하는 데 사용됩니다 .


어떤 이유로 ??운영자는이 동등 가정하더라도, 비 nullable 형식을 사용할 수 없습니다 model == null ? new T() : model, 당신은 있다 nullable이 아닌 유형의 널 비교를 허용했다.

대신 삼항 연산자 또는 if 문을 사용하여 추가 제약없이 원하는 것을 정확하게 얻을 수 있습니다.

public static T Method<T>(T model) where T : new()
{
   var m = model == null ? new T() : model;
}

model ?? new T()의미 model == null ? new T() : model. 모델이 Null이 불가능하고 Null이 불가능한 개체에 ==적용 할 수 없다는 보장은 없습니다 null. 제약 조건을로 변경하면 where T : class, new()작동합니다.


T를 "수업"으로 표시하고 당신은 갈 수 있습니다.

참조 URL : https://stackoverflow.com/questions/17080403/operator-cannot-be-applied-to-operands-of-type-t-and-t

반응형