Vb.net 为什么键入.Equals(t1,t2)而不是相等运算符?

Vb.net 为什么键入.Equals(t1,t2)而不是相等运算符?,vb.net,reflection,types,equals,Vb.net,Reflection,Types,Equals,为什么必须使用Type.Equals(t1,t2)来确定等效类型,而不是相等运算符(例如,对于VB.NET,t1=t2) 它似乎与.NETAPI的其他部分不一致 VB.NET中的示例: 如果GetType(String)=GetType(String),则 Debug.Print(“当然是一样的”) 如果 导致编译时错误“运算符“=”未为类型“System.Type”和“System.Type”定义。”鉴于加载类型的方式,这让我感到惊讶。你从哪里听说的 这表明它是通过属性进行比较的,但我不确定在

为什么必须使用
Type.Equals(t1,t2)
来确定等效类型,而不是相等运算符(例如,对于VB.NET,
t1=t2

它似乎与.NETAPI的其他部分不一致

VB.NET中的示例:

如果GetType(String)=GetType(String),则
Debug.Print(“当然是一样的”)
如果


导致编译时错误“
运算符“=”未为类型“System.Type”和“System.Type”定义。

鉴于加载类型的方式,这让我感到惊讶。你从哪里听说的

这表明它是通过属性进行比较的,但我不确定在什么情况下两个不同类型的对象将具有相同的基础系统类型


我真的很想看看这个重要的例子。。。我的猜测是,在“用户代码”的任何地方,它们都是相同的东西,但在重要的地方可能有一些狡猾的BCL代码。

查看Reflector中的源代码,我看不出Type.Equals(t1,t2)的处理方式与t1=t2有什么不同。(实际上没有类型.Equals;它将实际调用Object.Equals)

在C#中,T1==T2工作正常。

根据,VB相等运算符执行值比较,而不是引用比较。使用Type.Equals(t1,t2)强制它进行引用比较。如果t1和t2都是类型,我想这两种都可以,但我是个C#人,所以我知道什么。如果我不关心确切的类型匹配,我可能更喜欢对已知类使用
is
语法和
IsInstanceOf

Typeof a Is Boolean

a.GetType().IsAssignableFrom( b.GetType() )

在VB.NET中,Is是用于测试类型相等性的语言运算符。注意Type.Equals测试相同类型的两个变量是否指向同一个对象。如下面的示例所示

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim X As New TestObject
        Dim Y As New TestObject

        If X Is Y Then MsgBox("The Same 1")
        If Type.Equals(X, Y) Then MsgBox("The Same 2")

        X = Y
        If X Is Y Then MsgBox("The Same 3")

        If Type.Equals(X, Y) Then MsgBox("The Same 4")
    End Sub
End Class

Public Class TestObject
    Public Value As Double
End Class
之所以这样做,是因为BASIC语言中“equals”运算符的历史记录。在VB4中引入对象时,选择了IS来测试相等性,因为感觉重载相等会有问题

我建议在google和usenet上搜索Paul Vicks关于为什么一些基本习惯用法被移植,而另一些没有移植的评论。我相信在本例中是为了避免VB.NET引入时出现混淆

ObjectA=ObjectC’,使ObjectA引用ObjectC引用的相同对象

在VB6中设置为ObjectA=ObjectC

在VB4中引入对象时,使用and Set处理对象而不是重载equals的原因也是一样的


最终,这些怪癖成为了基本编码方式的一部分。

不,就我所见,类型确实覆盖了Equals。。。至少在.NET 3.5中,它覆盖了Type.Equals(Type),但不覆盖oper==将映射到的类型Equals(Type,Type),因此这里是相关的。非常感谢链接,我现在理解了它。我必须使用Is运算符,例如t1是t2。IsInstanceOf不是GetType中的方法。然而,有一个IsInstanceOfType,但它以一个对象(不是一个类型)作为参数,它的用法如下:typeof(int)。IsInstanceOfType(3)。我想你想要的是IsAssignableFrom,它的用法是这样的:typeof(Animal)。IsAssignaleFrom(typeof(Leon)你可能是对的——我想我最初想的是确切的类型相等(并简单地加上一个额外的GetType()).AssignableFrom更适合于非精确匹配,不过.Resharper 7对比较类型实例有一个具体的建议-它建议将t1.Equals(t2)更改为t1==t2(其中t1和t2属于
类型
)。例如,对于
类型字符串
对象
的实例,此建议不会出现。(我试过C#,但我想这对VB来说是一样的)。知道为什么吗?附言。正在研究Type.Equals()的实现,它确实比较了底层SystemType属性的引用相等性。@CristiDiaconescu:这里可能会有很小的效率提高?可能是。Re#的建议通常在功能或可读性方面有更明显的提高。。。