3

为什么必须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

4 回答 4

4

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

Typeof a Is Boolean

a.GetType().IsAssignableFrom( b.GetType() )
于 2008-11-14T11:56:27.133 回答
2

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

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

我真的很想看到一个重要的例子......我的猜测是,从“用户代码”中的任何地方它们都是一样的,但可能有一些狡猾的 BCL 代码在它重要的地方。

于 2008-11-14T11:48:25.150 回答
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 语言中“等于”运算符的历史。当在 VB4 中引入对象时,选择 IS 来测试相等性,因为感觉重载 equals 会产生问题。

我建议在 google 和 usenet 中搜索 Paul Vicks 关于为什么移植了一些单独的 BASIC 习语以及为什么没有移植其他习语的评论。我相信在这种情况下是为了避免混淆,因为 VB.NET 引入

ObjectA = ObjectC '这会导致 ObjectA 引用与 ObjectC 引用的对象相同的对象。

而在 VB6 中它是 Set ObjectA = ObjectC

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

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

于 2008-11-14T18:41:07.690 回答
0

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

在 C# 中,T1 == T2 工作得很好。

于 2008-11-14T11:51:21.197 回答