Почему Type.Equals (t1, t2), а не оператор равенства?

Почему для определения эквивалентных типов необходимо использовать 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'."

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
4 155
4

Ответы 4

Это меня удивляет, учитывая способ загрузки типов. Откуда вы это слышали?

документы для System.Type.Equals (Type) предполагает, что он сравнивается с помощью свойства UnderlyingSystemType, но я не уверен, при каких обстоятельствах два разных объекта Type будут иметь один и тот же базовый тип системы.

Мне было бы действительно интересно увидеть пример, в котором это имело значение ... мой угадать заключается в том, что из любого места в "пользовательском коде" они будут одинаковыми, но там, где это имеет значение, может быть какой-то хитрый код BCL.

В Resharper 7 есть конкретное предложение для сравнения экземпляров Type - он предлагает изменить t1.Equals (t2) на t1 == t2 (где t1 и t2 относятся к типу Type). Это предложение не отображается, скажем, для экземпляров типа string или object. (Я пробовал C#, но, думаю, это то же самое для VB). Есть идеи, почему?

Cristian Diaconescu 18.10.2012 19:35

PS. Рассматривая реализацию Type.Equals (), он действительно сравнивает свойства UnderlyingSystemType на предмет ссылочного равенства.

Cristian Diaconescu 18.10.2012 19:37

@CristiDiaconescu: Возможно, здесь можно было добиться повышения эффективности очень легкий?

Jon Skeet 18.10.2012 19:39

Может быть. Подсказки Re # обычно имеют более очевидные преимущества с точки зрения функциональности или удобочитаемости ...

Cristian Diaconescu 20.10.2012 01:08

Глядя на исходный код в Reflector, я не вижу, как Type.Equals (t1, t2) будет обрабатываться иначе, чем t1 = t2. (На самом деле нет Type.Equals; он фактически вызовет Object.Equals).

В C# T1 == T2 работает нормально.

Нет, Type действительно переопределяет Equals, насколько я понимаю ... по крайней мере, в .NET 3.5.

Jon Skeet 14.11.2008 14:52

Он переопределяет Type.Equals (Type), но не Equals (Type, Type), которому будет сопоставляться oper ==, следовательно, соответствующий здесь.

James Curran 15.11.2008 00:25

Согласно это, оператор равенства VB выполняет сравнение значений, а не сравнение ссылок. Использование Type.Equals (t1, t2) заставляет его выполнять сравнение ссылок. Если бы t1 и t2 были типами, я бы подумал, что любой из них будет работать, но я парень C#, так что я знаю. Я бы, вероятно, предпочел использовать синтаксис is для известных классов и IsInstanceOf, если меня не волнует точное соответствие типа.

Typeof a Is Boolean

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

Большое спасибо за ссылку, теперь я понял. Вместо этого мне нужно использовать оператор Is, например t1 - это t2.

Jay Mooney 14.11.2008 15:06

IsInstanceOf не является методом GetType. Однако есть IsInstanceOfType, но он принимает в качестве аргумента объект (а не тип) и предназначен для использования следующим образом: typeof (int) .IsInstanceOfType (3). Я думаю, что вам нужно IsAssignableFrom, который предназначен для использования следующим образом: typeof (Animal) .IsAssignaleFrom (typeof (Leon)

Olmo 15.12.2009 19:17

Вы, наверное, правы - я думаю, что изначально я думал о точном равенстве типов (и просто добавил дополнительный GetType ()). Однако AssignableFrom лучше работает с неточным соответствием.

tvanfosson 15.12.2009 21:36

В 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 комментарии Пола Викса о том, почему некоторые отдельные идиомы BASIC были перенесены, а другие - нет. Я считаю, что в этом случае нужно было избежать путаницы, поскольку VB.NET представил

ObjectA = ObjectC ', что заставляет ObjectA ссылаться на те же объекты, на которые ссылается ObjectC.

В то время как в VB6 было установлено ObjectA = ObjectC

По той же причине, по которой, когда объекты были введены в VB4, IS и Set использовались для работы с объектом вместо перегрузки equals.

В конечном итоге эти причуды стали частью Основного способа кодирования.

Другие вопросы по теме