IT

'! = '연산 독성'T '및'T '유형의 피연산자에 적용 할 수 있습니다.

lottoking 2020. 8. 21. 08:07
반응형

'! = '연산 독성'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모든 유형이 될 수 있습니다. 이러한 연산자가 (구조체) 유형에 정의되어 있지 않으면 구조체에 ==/ !=사용할 수 없습니다 .

참고 URL : https://stackoverflow.com/questions/8982645/how-to-solve-operator-cannot-be-applied-to-operands-of-type-t-and-t

반응형