Постинкрементная перегрузка оператора

Я попытался воссоздать сценарий, и он сработал для меня. Сообщение об ошибке, которое вы получаете, является уведомлением бота по умолчанию о необработанном исключении. Я бы посоветовал вам сделать следующие шаги:

1.Загрузить код бота и запустить его локально, чтобы проверить на наличие ошибок.

2. Попробуйте отладить бот, используя ngrok .

Вы можете использовать документацию здесь для устранения проблемы.

16
задан RedGlyph 3 April 2013 в 16:57
поделиться

3 ответа

Ключ находится в понимании как строка Account b = a++; работы. Учитывая то, как написан Ваш код, эта строка является эквивалентом этого:

Account b = a;
a++;

И это - заказ, в котором это выполнит. Присвоение эффективно (1) происходит перед инкрементом. Так, первый эффект этой строки состоит в том, что a и b оба относятся к исходному объекту a.

Теперь ++ часть будет оценена. В методе оператора, мы увеличиваем Balance из исходного объекта. В этой точке a и b оба указывают на оригинал с a Balance из 11, и b продолжит делать так.

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

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

Как @MarkusQ указанный, ++ оператор предназначен, чтобы сделать оперативную модификацию. Путем генерации нового объекта Вы повреждаете то предположение. Оператор, перегружающийся на объектах, является хитрым предметом, и это - превосходный пример того, почему его лучше избегают в большинстве случаев.


1 - Только для пользы точности, присвоения на самом деле не происходит перед инкрементом при контакте с операторами на объектах, но конечным результатом является то же в этом случае. На самом деле ссылка исходного объекта копируется, операция выполняется на оригинале, и затем скопированная ссылка присвоена левой переменной. Просто легче объяснить, притворяетесь ли Вы, что присвоение происходит сначала.

То, что действительно происходит, то, что это:

Account b = a++;

результаты в этом, из-за того, как ++ оператор работает над объектами:

Account copy = a;

Account x = new Account("operator ++", a.Balance);
a.Balance += 1; // original object's Balance is incremented
a = x; // a now points to the new object, copy still points to the original

Account b = copy; // b and copy now point at the same, original, object
12
ответ дан 30 November 2019 в 21:20
поделиться

Моя первая мысль состояла в том, чтобы указать, что нормальная семантика ++ существует модификация. Если бы Вы хотите подражать этому, Вы записали бы:

public static Account operator ++(Account a)
{
    a.Balance += 1;
    return a;
}

и не создают новый объект.

Но затем я понял, что Вы пытались подражать инкременту сообщения.

Таким образом, мое долгое размышление, "не делают этого" - семантика не отображается хорошо вообще на объекты, так как "используемое" значение является действительно изменяемым местом хранения. Но никому не нравится быть сказанным, "не делают этого" случайным незнакомцем, таким образом, я позволю Microsoft сказать Вам не делать это. И я боюсь, что их слово является окончательным по таким вопросам.

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

14
ответ дан 30 November 2019 в 21:20
поделиться

Необходимо всегда возвращать измененное значение. C# использует это в качестве нового значения и возвращает старое или новое значение как подходящее для оператора.

1
ответ дан 30 November 2019 в 21:20
поделиться
Другие вопросы по тегам:

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