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
(값 유형으로 struct
C 번호하여). 이것이 컴파일러가 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)
{
}
}
'Programing' 카테고리의 다른 글
IEnumerator와 IEnumerable의 차이점은 무엇입니까? (0) | 2020.08.26 |
---|---|
Windows의 Cygwin에서 crontab을 어떻게 실행합니까? (0) | 2020.08.26 |
메시지 펌프 란? (0) | 2020.08.26 |
두 가지 조건을 하나로 확인하는 방법 (0) | 2020.08.26 |
Powershell에서 head, tail, more, less, sed를 수행하는 방법은 무엇입니까? (0) | 2020.08.26 |