为什么C#允许将对象隐式转换为用于等式比较的int,但不允许将对象类型转换为对象类型比较,即使存在隐式运算符?为什么进行相等性检查,不允许隐式转换对象类型,但对于int?
bool errorHere = valueOnly == valuePair;
一行在底部给出例外。
class Program
{
static void Main(string[] args)
{
ValueOnly valueOnly = new ValueOnly();
ValuePair valuePair = new ValuePair();
bool areEqual = valueOnly.Value == valuePair;
bool errorHere = valueOnly == valuePair;
bool butNotHere = valueOnly == (ValueOnly)valuePair;
valueOnly = valuePair; // Or Here
}
}
public class ValuePair
{
public int Value { get; set; }
public string Text { get; set; }
public static implicit operator ValueOnly(ValuePair valuePair) {
if (valuePair.Text != null || valuePair.Value != 0) {
return new ValueOnly() { Value = valuePair.Value };
}
return null;
}
public static implicit operator int(ValuePair valuePair) {
return valuePair.Value;
}
}
public class ValueOnly
{
public int Value { get; set; }
}
以下是错误:
Error Operator '==' cannot be applied to operands of type 'ValueOnly' and 'ValuePair'
也许我是说错了,但如果是这样,为什么这个工作? “bool areEqual = valueOnly.Value == valuePair;” valueOnly上的Value属性是一个int,并且valuePair被隐式转换为一个int ... – Daryl
您引用的行正在使用定义的隐式运算符执行显式转换。我想真正的问题是,为什么我必须明确定义转换? – Daryl
@Daryl:在再次阅读您的问题后修改。你必须明确地定义从'ValuePair'到'ValueOnly'的转换,因为这两种类型是不相关的。 – Jon