我有一个泛型类,它包含一个值。此类存储一个默认值,我想检查存储的值是否等于默认值。
起初,我只是尝试过:
public bool IsDefault
{
get
{
return value == defaultValue;
}
}
但遗憾的是(并且令人惊讶地)没有编译 - 编译器抱怨,它无法将T与T进行比较。第二种方法是:
public bool IsDefault
{
get
{
if (value == null)
return defaultValue == null;
else
return value.Equals(defaultValue);
}
}
它有效,但我的字符串有问题,因为我的情况下的空字符串等于空字符串,但前面的代码不包括它。
我可能会将字符串专门用于字符串,但如果没有必要,我会避免使用它。有没有办法以通用的方式比较两个T?
编辑:以回应评论
我们假设,该类如下所示:
public class MyClass<T>
{
private T value;
private T defaultValue;
public MyClass(T newDefault)
{
value = newDefault;
defaultValue = newDefault;
}
public T Value
{
get
{
return value;
}
set
{
this.value = value;
}
}
public bool IsDefault
{
get
{
// ?
}
}
}
答案 0 :(得分:4)
您的类的构造函数应该使用IEqualityComparer<T>
作为参数,并且重载可以传递到EqualityComparer<T>.Default
。存储它并用于测试是否相等。如果是字符串,请传入IEqualityComparer<string>
"" == null
。
像这样:
class Example<T>
{
private readonly IEqualityComparer<T> comparer;
private readonly T defaultValue;
private T value;
public Example(T value, T defaultValue, IEqualityComparer<T> comparer)
{
this.value = value;
this.defaultValue = defaultValue;
this.comparer = comparer;
}
public Example(T value, T defaultValue)
: this(value, defaultValue, EqualityComparer<T>.Default)
{
}
public Example(T value)
: this(value, default(T))
{
}
public Example()
: this (default(T))
{
}
public bool IsDefault
{
get
{
if (value == null)
{
return defaultValue == null;
}
else
{
return comparer.Equals(value, defaultValue);
}
}
}
}