Как объект не может сравниться сам по себе? (Задача сценария служб SSIS)

Проблема в середине Main в строке, которая гласит

if ((byte[])Dts.Variables["User::EncryptionKey"].Value == noKey)

Когда GetEncryptionKey 'терпит неудачу' и возвращает noKey, 'if' все еще принимает путь 'else', и я не понимаю, почему. Я попробовал это с одинаковыми результатами.

if (noKey.Equals((byte[])Dts.Variables["User::EncryptionKey"].Value))

Если каждая ссылка на noKey не каким-то образом создает новую копию байта [0], я не вижу, как они могут быть неравными. Я прошел через множество раз, и они, безусловно, выглядят равными.

    private static byte[] noKey = new byte[0];

    public void Main()
    {
        int keyLen = 32;
            Dts.Variables["User::EncryptionKey"].Value =
                GetEncryptionKey((string)Dts.Variables["User::EncryptionKeyAsHex"].Value, keyLen);

        if ((byte[])Dts.Variables["User::EncryptionKey"].Value == noKey)
        {
            Dts.TaskResult = (int)ScriptResults.Failure;
        }
        else
        {
            Dts.TaskResult = (int)ScriptResults.Success;
        }
    }

    private static byte[] GetEncryptionKey(string hexString,int numBytes)
    {
            return noKey;  //<-this definitely does get hit!
    }

2 ответа

Вот в чем проблема: "Если каждая ссылка на noKey не будет каким-либо образом создавать новую копию байта [0], я не вижу, как они могут быть неравными". Мне никогда не приходило в голову, что Dts....Value.set был тем, кто создает новую копию.

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

Сохранение возвращенного значения в локальной переменной для использования в сравнении позволяет избежать этой проблемы.

Я думаю, что вы путаете концепцию здесь, два массива не одинаковы, потому что они имеют одни и те же элементы на нем. Оператор == вызывает ReferenceEquals и проверяет, указывают ли оба элемента на одно и то же пространство в памяти.

Взгляните на разницу здесь C# .Equals(), .ReferenceEquals() и оператор ==

Попробуйте использовать подход @Eris. Надеюсь это поможет

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