MyGuid.Equals (OtherGuid) НЕ РАВНО? - PullRequest
       5

MyGuid.Equals (OtherGuid) НЕ РАВНО?

3 голосов
/ 18 августа 2010

Когда я использую MyGuid.ToString (). Equals (OtherGuid.ToString ())

они равны, почему они не равны, когда я сравниваю чистый Guid?

Обновление:

Ну, проблема здесь может заключаться в том, что я использую сторонний элемент управления.

. Ключ ниже имеет Guid, а CommitteeID ​​- тоже Guid.Они никогда не были равны, только когда я сделал

ToString () на обоих Guid, они были равны, что странно.

 for (int i = 0; i < this.ultraCalendarInfo.Owners.Count; i++) 
                if (ultraCalendarInfo.Owners[i].Key.ToString().Equals(committeeId))
                    ultraCalendarInfo.Owners[i].Visible = isVisible; 

Ответы [ 3 ]

12 голосов
/ 18 августа 2010

Я не могу воспроизвести проблему:

using System;

class Program
{
    static void Main(string[] args)
    {
        Guid x = Guid.NewGuid();
        Guid y = new Guid(x.ToString());

        Console.WriteLine(x == y);
        Console.WriteLine(x.Equals(y));
        Console.WriteLine(x.ToString() == y.ToString());
    }
}

Производит:

True
True
True

Пожалуйста, дайте похожую короткую, но полную программу, которая демонстрирует проблему.

РЕДАКТИРОВАТЬ: Я думаю, что я вижу проблему сейчас, и это в вашем коде:

if (ultraCalendarInfo.Owners[i].Key.ToString().Equals(committeeId))

Вы заявили:

У .Key ниже есть Guid и committeeId тоже Guid.

Вы звоните ToString() по Guid, но не по committeeId, так что условие никогда не будет выполнено.Если вы позвонили ToString() на и или , либо , все должно быть в порядке.

Я сильно подозреваю, что это (или что-то очень похожее, если вышеприведенное неваш реальный код) это проблема.Вызов ToString() более одного раза (т.е. guid.ToString().ToString() и т. Д.), Конечно, всегда будет возвращать одну и ту же строку - поэтому, если у вас несбалансированное количество вызовов ToString() (0 с одной стороны и 1 с другой), то добавлениедополнительный вызов в обе стороны "исправит" проблему ... но устранение одного из ToString() вызовов - настоящее решение проблемы.

2 голосов
/ 18 августа 2010

Рассмотрим приведенный ниже код.

object g1 = Guid.NewGuid();
object g2 = new Guid(((Guid)g1).ToByteArray());
Console.WriteLine("{0}\r\n{1}", g1, g2);
Console.WriteLine("   Equals: {0}", g1.Equals(g2));
Console.WriteLine("Object ==: {0}", g1 == g2);
Console.WriteLine(" Value ==: {0}", (Guid)g1 == (Guid)g2);

Сохранение GUID в переменной типа «object» приводит к «упаковыванию» его в ссылочный тип.Когда вы используете «==» для сравнения ссылочных типов, они могут не совпадать, даже если содержащиеся в них значения равны.Это отличие от типов значений, потому что если бы вы объявили g1 и g2 выше как Guid, вы бы получили True для всех тестов на равенство.Но приведенный выше код возвращает False для теста "==".Обратите внимание, что если вы «распакуете» значения, как показано в третьем тесте, они увидят, что значения равны.Также будет видно, что они равны, если вы используете метод «Равные», который можно (и можно) переопределить для более интеллектуального сравнения объектов на основе их конкретных типов.

0 голосов
/ 19 августа 2010

Поскольку вы не показываете объявление двух направляющих, я могу думать только о том, что это разные типы направляющих (в качестве примера я использую SqlGuid):

 Sub Main()

        Dim stringValue = Guid.NewGuid().ToString()

        Dim first = New Guid(stringValue)
        Dim second = New SqlTypes.SqlGuid(stringValue)

        Console.WriteLine(first = second)    'True'
        Console.WriteLine(first.Equals(second))    'False'
        Console.WriteLine(first.ToString() = second.ToString())    'True'
        Console.ReadKey()

    End Sub
...