운영자 '??' '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 그의 코멘트에 언급, 우리는 추가해야하는 이유 class
T는 같은 값 형식이 될 수 있기 때문에 제약은 int
이후 ??
우리가 추가 할 필요가 있으므로, null이 될 수있는 유형에 대한 연산자 (널 병합) 체크 class
제약 조건을 값 유형을 제외합니다.
편집 : Alvin Wong의 답변은 nullable 유형의 경우에도 적용되었습니다. 실제로 구조체이지만 ??의 피연산자가 될 수 있습니다. 운영자. nullable 형식에 대해 Alvin의 오버로드 된 버전없이 Method
반환 된다는 점에 유의하십시오 null
.
??
Null 통합 연산자입니다. nullable이 아닌 형식에는 적용 할 수 없습니다. 때문에 T
아무것도 할 수있다, 그것은 할 수 있습니다 int
또는 다른 원시적 인, 비 - nullable 형식.
조건을 추가하는 경우 where T : class
(앞에 지정해야 함 new()
) T
null을 허용하는 클래스 인스턴스가됩니다.
많은 사람들은 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인지 여부.
? 연산자는 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
'programing' 카테고리의 다른 글
jquery로 요소의 클래스 이름을 변경하는 방법 (0) | 2021.01.16 |
---|---|
Django URLS, 루트를 앱에 매핑하는 방법은 무엇입니까? (0) | 2021.01.16 |
.emacs에 무엇이 있습니까? (0) | 2021.01.16 |
중복을 찾기 위해 T-SQL 코드를 얻는 방법은 무엇입니까? (0) | 2021.01.16 |
cocoaLumberjack을 사용하여 로그 파일이 저장되는 위치 (0) | 2021.01.16 |