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

thisによると、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プロパティを介して比較していることを示唆していますが、どのような状況で 2 つの異なる Type オブジェクトが同じ基になるシステム タイプを持つかはわかりません。

これが重要な例を見てみたいと思います...私の推測では、「ユーザーコード」のどこから見ても同じことですが、重要なところに狡猾なBCLコードがあるかもしれません。

于 2008-11-14T11:48:25.150 に答える
0

VB.NET では、 Is は型の等価性をテストするために使用される言語演算子です。Type.Equals は、同じ型の 2 つの変数が同じオブジェクトを指しているかどうかをテストすることに注意してください。以下の例に示すように。

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 が選択されました。

いくつかの個々の BASIC イディオムが移植された理由と移植されなかった理由についての Paul Vicks のコメントを google と usenet で検索することをお勧めします。このケースは、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 に答える