C# 为什么相等检查不允许对象类型的隐式转换,而允许int?
为什么C#允许将对象隐式转换为int以进行相等比较,而不允许将对象类型转换为对象类型比较,即使存在隐式运算符C# 为什么相等检查不允许对象类型的隐式转换,而允许int?,c#,implicit-conversion,C#,Implicit Conversion,为什么C#允许将对象隐式转换为int以进行相等比较,而不允许将对象类型转换为对象类型比较,即使存在隐式运算符 bool errorHere=valueOnly==valuePair行在底部给出异常 class Program { static void Main(string[] args) { ValueOnly valueOnly = new ValueOnly(); ValuePair valuePair = new ValuePair();
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'
C#绝大多数情况下不允许出于任何目的将对象隐式转换为int
s。我不确定你指的是不是那句台词
bool butNotHere = valueOnly == (ValueOnly)valuePair;
“允许”这样的转换。如果是的话,它不会做任何这样的事情。它只需调用您自己的转换运算符(如果我正确读取代码,它将返回null
,因为该值将是默认构造的整数),然后在两个对象之间进行引用比较(计算结果为false
,因为null
不等于任何引用)
不用说,一旦定义了隐式转换运算符,C#将在必要时使用它。因此,我认为你的问题必须更多地理解等式运算符是如何基于其参数类型工作的,而不是其他任何东西
更新,关于valueOnly==valuePair
检查:
C#规范7.10.6(参考类型相等运算符)规定:
使用预定义的引用类型是绑定时间错误
相等运算符来比较已知为
在绑定时不同。例如,如果绑定时间类型为
操作数有两种类型A和B,如果A和B都不是
从另一个派生出来,那么这两个就不可能了
引用同一对象的操作数。因此,该操作非常简单
被认为是绑定时间错误
如果您希望能够比较类类型的对象是否相等,最好的方法是实现IEquatable
接口,并重写object.Equals
以IEquatable.Equals
(这意味着您还必须重写object.GetHashCode
)来实现匹配
然而,在比较项目时依赖“隐藏”转换是个坏主意。如果我们谈论的是比较不相关的类,那么通过尽可能突出地比较,你将省去很多痛苦。为此,我建议采用低技术
if(valuePair.Value == valueOnly.Value)
C#绝大多数情况下不允许出于任何目的将对象隐式转换为int
s。我不确定你指的是不是那句台词
bool butNotHere = valueOnly == (ValueOnly)valuePair;
“允许”这样的转换。如果是的话,它不会做任何这样的事情。它只需调用您自己的转换运算符(如果我正确读取代码,它将返回null
,因为该值将是默认构造的整数),然后在两个对象之间进行引用比较(计算结果为false
,因为null
不等于任何引用)
不用说,一旦定义了隐式转换运算符,C#将在必要时使用它。因此,我认为你的问题必须更多地理解等式运算符是如何基于其参数类型工作的,而不是其他任何东西
更新,关于valueOnly==valuePair
检查:
C#规范7.10.6(参考类型相等运算符)规定:
使用预定义的引用类型是绑定时间错误
相等运算符来比较已知为
在绑定时不同。例如,如果绑定时间类型为
操作数有两种类型A和B,如果A和B都不是
从另一个派生出来,那么这两个就不可能了
引用同一对象的操作数。因此,该操作非常简单
被认为是绑定时间错误
如果您希望能够比较类类型的对象是否相等,最好的方法是实现IEquatable
接口,并重写object.Equals
以IEquatable.Equals
(这意味着您还必须重写object.GetHashCode
)来实现匹配
然而,在比较项目时依赖“隐藏”转换是个坏主意。如果我们谈论的是比较不相关的类,那么通过尽可能突出地比较,你将省去很多痛苦。为此,我建议采用低技术
if(valuePair.Value == valueOnly.Value)
要允许valueOnly==valuePair,必须将其添加到valuePair类中:
public static bool operator == (ValueOnly valueOnly, ValuePair valuePair){
ValueOnly value = valuePair;
return valueOnly.Value == value.Value;
}
这使用隐式转换,然后执行我正在寻找的相等性检查
现在我想起来了,隐式转换是愚蠢的(因为我没有为ValueOnly类提供相等运算符):
要允许valueOnly==valuePair,必须将其添加到valuePair类中:
public static bool operator == (ValueOnly valueOnly, ValuePair valuePair){
ValueOnly value = valuePair;
return valueOnly.Value == value.Value;
}
这使用隐式转换,然后执行我正在寻找的相等性检查
现在我想起来了,隐式转换是愚蠢的(因为我没有为ValueOnly类提供相等运算符):
也许我说错了,但如果是这样,为什么这样做?“bool areEqual=valueOnly.Value==valuePair;”valueOnly上的Value属性是一个int,并且valuePair被隐式转换为int。您引用的行正在使用定义的隐式运算符执行显式转换。我想真正的问题是,为什么我必须明确定义转换?@Daryl:在再次阅读您的问题后进行了修订。您必须明确定义从ValuePair
到ValueOnly
的转换,因为这两种类型是不相关的。不确定不相关的意思是什么,int和ValuePair是如何相关的?@Daryl:unrelated==不在继承层次结构中。你从哪里知道int
和ValuePair