C # 두 일반 값 비교
중복 가능성 :
== 연산자를 C #의 제네릭 형식에 적용 할 수 없습니까?
다음과 같이 코딩했습니다.
public bool IsDataChanged()
{
T value1 = GetValue2;
T value2 = GetValue1();
return (valueInDB != valueFromView);
}
현재이 함수는 " 연산자 '! ='를 'T'및 'T'유형의 피연산자에 적용 할 수 없습니다. "오류와 함께 컴파일되지 않습니다 . 이 기능을 작동 시키려면 어떻게해야합니까?
참조 유형임을 나타 내기 위해 T : 클래스를 추가하지 않는 한 일반 유형 (특별한 경우 foo == null 제외)에 연산자를 사용할 수 없습니다 (그런 다음 foo == bar가 합법적 임).
EqualityComparer<T>
.Default를 사용하십시오 . 다음 중 하나없이 ==에 대한 연산자 오버로드 만 제공하는 유형 에서는 작동 하지 않습니다 .
- 도구
IEquatable<T>
- object.Equals ()를 재정의합니다.
일반적으로 == 연산자를 구현하고 이들 중 적어도 하나를 수행하지 않는 것은 어쨌든 매우 나쁜 생각이므로 문제가되지 않을 것입니다.
public bool IsDataChanged<T>()
{
T value1 = GetValue2;
T value2 = GetValue1();
return !EqualityComparer<T>.Default.Equals(value1 , value2);
}
제한하지 않으면 IEquatable<T>
EqualityComparer 기본 폴 백이 구현되지 않으면 값 유형과 함께 사용될 때 boxing을 유발할 수 있습니다 IEquatable<T>
(사용중인 유형을 제어하는 경우 중요하지 않을 수 있음). 나는 당신이 =를 사용하고 있다고 가정하고 있습니다! 성능을 위해 Generic 유형으로 제한 하면 Object.Equals (object) 경로를 통해 우발적 인 권투를 피할 수 있습니다.
그것은 당신을 위해 일할 것입니다.
public bool test<T>(T test, T test2) where T : class
{
return (test != test2);
}
이것은 귀하의 질문에 댓글을 단 예에서 간단히 붙여 넣었습니다.
형식은 IComparable 또는 IEquatable 인터페이스 를 구현해야합니다 .
아마도 a! = b를! (a == b)로 다시 작성하거나 CompareTo () 또는 Equals () 메서드를 명시 적으로 호출해야 할 것입니다.
객체에 .Equals () 메서드를 오버로드하고 평가를 다음과 같이 변경할 수 있습니다.
return (!valueInDB.Equals(valueFromView));
valueInDB 및 valueFromView가 객체라고 가정합니다. 예제 변수의 이름은 비교에 사용 된 것과 동일하지 않으므로 가정해야했습니다.
편집 : 3 초 차이가 있습니다! 오버로딩에 대한 참고 사항은 유형 내에서 값을 비교해야하는 경우 Object 클래스의 기본 .Equals ()만으로는 충분하지 않습니다. 복잡한 유형에 대한 메모리 비교 만 수행하기 때문입니다. 개체를 비교할 방법을 오버로드하고 구현을 제공해야합니다.
참고 URL : https://stackoverflow.com/questions/488250/c-sharp-compare-two-generic-values
'Programing' 카테고리의 다른 글
Flask-Session 확장을 사용하여 플라스크 세션에 비밀 키가 설정되지 않았습니다. (0) | 2020.11.08 |
---|---|
Xcode UI 테스트-UI 테스트 실패-검색 필드 "취소"버튼을 탭할 때 표시 (AX 작업에 의해)로 스크롤하지 못했습니다. (0) | 2020.11.08 |
이미 데이터가 포함 된 데이터 테이블에 새 열 및 데이터 추가-C # (0) | 2020.11.08 |
파일 경로에서 환경 변수 사용 (0) | 2020.11.08 |
왜 우리는 들쭉날쭉 한 배열과 다차원 배열을 가지고 있습니까? (0) | 2020.11.08 |