C# неявные преобразования и == оператор

Вы можете использовать с этим форматом (протестировано на Laravel 5.5), в моем случае я использовал для получения данных о соединениях с базой данных и использования на контроллере:

$User = env('DB_USERNAMEchild','');
$Pass = env('DB_PASSWORDchild','');

Второй параметр может быть нулевым или установите любое значение по умолчанию, если DB_USERNAMEchild имеет значение null.

Ваш .env файл может быть таким же:

DB_HOST=localhost
DB_DATABASE=FATHERBD
DB_USERNAME=root
DB_PASSWORD=password

DB_DATABASEchild=ZTEST
DB_USERNAMEchild=root
DB_PASSWORDchild=passwordofchild
7
задан Jon Seigel 10 April 2010 в 19:00
поделиться

5 ответов

Неявный оператор работает только для присваивания.

Вы хотите перегрузить оператор равенства ( == ) как таковой:

class a
{
    public static bool operator ==(a x, b y)
    {
        return x == y.a;
    }

    public static bool operator !=(a x, b y)
    {
        return !(x == y);
    }
}

class b
{
    public a a{get;set;}
    public static implicit operator a(b b)
    {
        return b.a;
    }
}

Это должно позволить вам сравнить два объекта типа a и b , как предлагается в вашем сообщении.

var x = new a();
var y = new b();
bool c = (x == y); // compiles

Примечание:

Я рекомендую просто переопределить GetHashCode и Equals , как предупреждает компилятор, но, поскольку вы, кажется, хотите подавить их, вы можете сделать это следующим образом.

Измените объявление вашего класса a to:

#pragma warning disable 0660, 0661
class a
#pragma warning restore 0660, 0661
{
    // ...
}
15
ответ дан 6 December 2019 в 06:50
поделиться

Можно ли использовать оператор == в экземпляры разных типов, где один можно неявно преобразовать в другое?

Да.

Что я пропустил?

Вот соответствующая часть спецификации. Вы пропустили выделенное слово.

Предопределенное равенство ссылочного типа операторы требуют, чтобы оба операнда являются значениями ссылочного типа или буквальный нуль. Кроме того, стандарт неявное преобразование существует из тип любого операнда к типу другой операнд.

Пользовательское преобразование по определению не является стандартным преобразованием. Это ссылочные типы. Следовательно, предопределенный оператор равенства ссылочных типов не является кандидатом.

Если типы должны быть одинаковыми, вызывая ==, тогда почему [double == int] работает?

Ваше предположение, что типы должны быть одинаковыми, неверно. Существует стандартное неявное преобразование из int в double и есть оператор равенства, который принимает два двойных значения, так что это работает.

Я думаю, вы также пропустили этот бит:

Это ошибка времени компиляции, чтобы использовать предопределенное равенство ссылочного типа операторы для сравнения двух ссылок которые, как известно, отличаются время компиляции. Например, если типы операндов во время компиляции два типа классов A и B, и если ни A, ни B не происходят от другое, то было бы невозможно два операнда для ссылки на один и тот же объект. Таким образом, операция считается ошибкой времени компиляции.

11
ответ дан 6 December 2019 в 06:50
поделиться

Я предполагаю, что вам нужно фактически переопределить оператор == для интересующих вас типов. Будет ли среда компиляции / выполнения по-прежнему жаловаться, даже если типы являются неявными convertable - это то, с чем вам придется поэкспериментировать.

public static bool operator ==(a a, b b)
    {
        //Need this check or we can't do obj == null in our Equals implementation
        if (((Object)a) == null)
        {
            return false;
        }
        else
        {
            return a.Equals(b);
        }
    }

В качестве альтернативы просто используйте реализации Equals, такие как ole6ka, и убедитесь, что реализация выполняет необходимое преобразование типов.

1
ответ дан 6 December 2019 в 06:50
поделиться

Используйте это

 bool c = a.Equals(b);
-1
ответ дан 6 December 2019 в 06:50
поделиться

http://msdn.microsoft.com/en-us/library/8edha89s.aspx

В каждом случае один параметр должен быть того же типа, что и класс или структура который объявляет оператор (...)

0
ответ дан 6 December 2019 в 06:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: