为什么C#无法将两种对象类型相互比较,但VB却没有?

Moh*_*kar 152 .net c# vb.net comparison

我在C#中有两个对象,不知道它是布尔值还是其他任何类型.但是,当我尝试比较那些C#未能给出正确答案时.我用VB.NET尝试了相同的代码并且做到了!

如果有解决方案,谁能告诉我如何解决这个问题?

C#:

object a = true;
object b = true;
object c = false;
if (a == b) c = true;
MessageBox.Show(c.ToString()); //Outputs False !!
Run Code Online (Sandbox Code Playgroud)

VB.NET:

Dim a As Object = True
Dim b As Object = True
Dim c As Object = False
If (a = b) Then c = True
MessageBox.Show(c.ToString()) '// Outputs True
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 167

在C#中,==运算符(当应用于引用类型表达式时)执行引用相等性检查,除非它被重载.您正在比较两个引用是拳击转换的结果,因此这些是不同的引用.

编辑:对于重载的类型==,您可以获得不同的行为 - 但这是基于表达式的编译时类型.例如,string提供==(string, string):

string x = new string("foo".ToCharArray());
string y = new string("foo".ToCharArray());
Console.WriteLine(x == y); // True
Console.WriteLine((object) x == (object) y); // False
Run Code Online (Sandbox Code Playgroud)

这里第一个比较是使用重载运算符,但第二个是使用"默认"引用比较.

在VB中,=操作员完成了更多的工作 - 它甚至不等同于使用object.Equals(x, y),因为类似的东西Option Compare会影响文本的比较.

从根本上说的运营商不相同的方式工作,并且不打算以相同的方式工作.

  • +1我知道你会在身边,你喜欢这些神秘的问题:) (17认同)
  • @VladL:是的,因为它将按执行时类型进行,并执行`bool == bool`比较. (4认同)
  • @AbZy:我希望能够提供一个更详细的解释'='在VB中做了什么,但规范并不十分清楚. (3认同)

Kon*_*lph 79

除了Jon的答案解释了事物的C#方面,这是VB的作用:

在VB中Option Strict On,通过= 总是测试值相等而不是参考相等来进行比较.实际上,一旦切换,您的代码甚至不会编译,Option Strict On因为System.Object没有定义Operator=.你应该总是选择这个选项,它比金星捕蝇草更有效地捕获虫子(尽管在你的特殊情况下,这种松懈的行为实际上是正确的).1

事实上,使用Option Strict OnVB,行为甚至比C#更严格:在C#中,a == b 要么触发调用,要么SomeType.operator==(a, b)如果不存在,则调用引用相等比较(相当于调用object.ReferenceEquals(a, b)).

另一方面,在VB中,比较a = b 总是调用相等运算符.2如果要使用引用相等性比较,则必须使用a Is b(再次,相同Object.ReferenceEquals(a, b)).


1)这是一个很好的指示,为什么使用Option Strict Off是一个坏主意:我已经使用VB.NET近十年,从.NET正式发布之前到几年前,我完全不知道a = b它有什么用Option Strict Off.它做了某种平等比较,但究竟发生了什么,为什么,不知道.它比C#的dynamic功能更复杂(因为它依赖于记录良好的API).以下是MSDN所说的内容:

因为Option Strict On提供强类型,防止意外的类型转换与数据丢失,不允许后期绑定,并提高性能,强烈建议使用它.

2) Jon提到了一个例外,字符串,其中为了向后兼容性,相等比较做了更多的事情.

  • +1这并没有像它真正应该的那样被投票.不使用"Option Strict On"必须被视为刑事犯罪...... (5认同)
  • +1.我认为这是一个案例,VB.NET的设计者成功地使这些语言"正常工作"给来自VB6和VBA的程序员,其中OOP不那么突出,因此参考相等的概念就不那么重要了.VB编码器可以编写好的工作代码,而无需考虑对象等等. (4认同)