如何解决操作员'=';不能应用于类型为';T';和';T';

本文关键字:不能 应用于 类型 解决 操作员 何解决 | 更新日期: 2023-09-27 18:21:09

此代码片段对int类型起到预期的作用

public class Test 
{
    public int Value
    {
        get => _Value;
        set
        {
            if (_Value != value)
                _Value = value;
        }
    }
    private int _Value;
}

int被通用T替换时,编译器会抱怨:

运算符'!='不能应用于类型为"T"answers"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是一个类型参数,可以是classstruct,因此编译器不允许您执行类和结构中都不存在的操作。

structs没有==和!=默认情况下(但可以添加),这就是编译器抱怨的原因。

如果使用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可以是任何类型。不能在结构上使用==/!=,除非在(struct)类型上定义了此类运算符。