Я попытался воссоздать сценарий, и он сработал для меня. Сообщение об ошибке, которое вы получаете, является уведомлением бота по умолчанию о необработанном исключении. Я бы посоветовал вам сделать следующие шаги:
1.Загрузить код бота и запустить его локально, чтобы проверить на наличие ошибок.
2. Попробуйте отладить бот, используя ngrok .
Вы можете использовать документацию здесь для устранения проблемы.
Ключ находится в понимании как строка 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
Моя первая мысль состояла в том, чтобы указать, что нормальная семантика ++ существует модификация. Если бы Вы хотите подражать этому, Вы записали бы:
public static Account operator ++(Account a)
{
a.Balance += 1;
return a;
}
и не создают новый объект.
Но затем я понял, что Вы пытались подражать инкременту сообщения.
Таким образом, мое долгое размышление, "не делают этого" - семантика не отображается хорошо вообще на объекты, так как "используемое" значение является действительно изменяемым местом хранения. Но никому не нравится быть сказанным, "не делают этого" случайным незнакомцем, таким образом, я позволю Microsoft сказать Вам не делать это. И я боюсь, что их слово является окончательным по таким вопросам.
P.S. Относительно того, почему это делает то, что это делает, Вы действительно переопределяете преинкрементный оператор и затем используете его, как будто это был постинкрементный оператор.
Необходимо всегда возвращать измененное значение. C# использует это в качестве нового значения и возвращает старое или новое значение как подходящее для оператора.