为什么必须使用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'.
”
答案 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的原因相同。
最终,这些怪癖成为了基本编码方式的一部分。