为什么Type.Equals(t1,t2)而不是相等运算符?

时间:2008-11-14 11:35:55

标签: vb.net reflection types equals

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

它似乎与.NET API的其他部分不一致。

VB.NET中的示例:

If GetType(String) = GetType(String) Then Debug.Print("The same, of course") End If

导致编译时错误为“Operator '=' is not defined for types 'System.Type' and 'System.Type'.

4 个答案:

答案 0 :(得分:4)

根据this,VB等式运算符进行值比较,而不是参考比较。使用Type.Equals(t1,t2)强制它进行参考比较。如果t1和t2是类型,我会认为其中任何一个都可行,但我是C#家伙所以我知道什么。如果我不关心确切类型匹配,我可能更喜欢对已知类和is使用IsInstanceOf语法。

Typeof a Is Boolean

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

答案 1 :(得分:2)

考虑到加载类型的方式,这让我感到惊讶。你是从哪里听到的?

docs for System.Type.Equals(Type)建议它通过UnderlyingSystemType属性进行比较,但我不确定在什么情况下两个不同的Type对象具有相同的底层系统类型。

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

在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上搜索保罗维克斯关于为什么某些单独的BASIC习语被移植以及为什么其他没有移植的原因。我相信这个案例是为了避免混乱,因为VB.NET引入了

ObjectA = ObjectC',它使ObjectA引用与ObjectC引用的相同对象。

在VB6中,它是Set ObjectA = ObjectC

在VB4 IS和Set中引入对象的原因与用于处理对象而不是重载equals的原因相同。

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