반응형
'! = '연산 독성'T '및'T '유형의 피연산자에 적용 할 수 있습니다. [중복]
이 질문에 이미 답변이 있습니다.
이 코드 조각은 다음 int유형에 대해 예상대로 작동 합니다.
public class Test
{
public int Value
{
get => _Value;
set
{
if (_Value != value)
_Value = value;
}
}
private int _Value;
}
int이 일반적으로 대체 되면 T컴파일러는 다음과 같이 불평합니다.
연산자 '! = '는'T '및'T '유형의 피연산자에 적용 할 수 없습니다.
왜 이런 일이 발생하고이를 사용 방법이 있습니까?
using System.Collections.Generic;
public class Test<T>
{
public T Value
{
get => _Value;
set
{
// operator== is undefined for generic T; EqualityComparer solves this
if (!EqualityComparer<T>.Default.Equals(_Value, value))
{
_Value = value;
}
}
}
private T _Value;
}
T유형 인수이며 class또는 일 수 있기 때문에 struct컴파일러는 클래스 및 체계에 존재하지 않는 작업을 수행하도록 허용하지 않습니다.
뼈에는 기본적으로 == 및! =가 없습니다 (하지만 추가 할 수 없음), 이것은 컴파일러가 불평하는 이유입니다.
where키워드를 사용하여 인수 유형에 제약 조건을 추가하면 컴파일러에서 해당 유형 \ 인터페이스 메소드 \ 연산자를 사용할 수 있습니다.
제한 T을 수class
public class Test<T> where T : class
{
public T Value
{
private T _Value;
get { return _Value; }
set
{
if (_value != value)
_Value = value;
}
}
}
단순히 또는 연산자 Equals대신 사용==
public class Test<T>
{
public T Value
{
private T _Value;
get { return _Value; }
set
{
if (!_value.Equals(value)
_Value = value;
}
}
}
T모든 유형이 될 수 있습니다. 이러한 연산자가 (구조체) 유형에 정의되어 있지 않으면 구조체에 ==/ !=를 사용할 수 없습니다 .
반응형
'IT' 카테고리의 다른 글
| Mocha로 JavaScript 테스트 -console.log를 사용하여 테스트를 디버깅해야합니까? (0) | 2020.08.22 |
|---|---|
| MANIFEST.in이 필요하며 그 안에 무엇이 거기에 있습니까? (0) | 2020.08.22 |
| if / else를 한 줄로 압축하는 방법은 무엇입니까? (0) | 2020.08.21 |
| 텍스트 깜박임 jQuery (0) | 2020.08.21 |
| CSS 전환에 대한 예비 (0) | 2020.08.21 |