此代码段按预期的int类型工作:
public class Test
{
public int Value
{
get => _Value;
set
{
if (_Value != value)
_Value = value;
}
}
private int _Value;
}
Run Code Online (Sandbox Code Playgroud)
当int被泛型替换时T,编译器抱怨:
运算符'!='不能应用于'T'和'T'类型的操作数
为什么会发生这种情况并且有办法解决它?
Meh*_*dad 136
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;
}
Run Code Online (Sandbox Code Playgroud)
gdo*_*ica 80
T是一个类型参数,可以是a class或a struct,因此编译器不允许您执行类和结构中不存在的操作.
结构体默认情况下没有==和!=(但可以添加),这就是编译器抱怨的原因.
如果使用where关键字向type参数添加约束,则编译器将允许您使用该类型\ interface method \运算符
约束T成为一个class
public class Test<T> where T : class
{
public T Value
{
private T _Value;
get { return _Value; }
set
{
if (_value != value)
_Value = value;
}
}
}
Run Code Online (Sandbox Code Playgroud)
或者只是使用Equals而不是==操作员
public class Test<T>
{
public T Value
{
private T _Value;
get { return _Value; }
set
{
if (!_value.Equals(value)
_Value = value;
}
}
}
Run Code Online (Sandbox Code Playgroud)
lep*_*pie 24
T可以是任何类型.除非在(struct)类型上定义了这样的运算符,否则不能在结构上使用==/ !=.
| 归档时间: |
|
| 查看次数: |
61766 次 |
| 最近记录: |