Я работаю над приложением ASP.NET в Visual Studio 2019. У меня возникла проблема, с которой я никогда раньше не сталкивался в C#. Похоже, я не могу объявить какие-либо целочисленные типы, кроме UInt64.
Попытка объявить Int64 или long дает мне ошибки, потому что говорит, что я пытаюсь преобразовать UInt64 (или ulong) в один из этих типов.
Конкретные ошибки следующие (показанные идентификаторы арендаторов Azure являются фиктивными значениями, не паникуйте):
Линия
Int64 tenantInt = 11132432026456784806;
выдает следующую ошибку
Error CS0266 Cannot implicitly convert type 'ulong' to 'long'. An explicit conversion exists (are you missing a cast?)
а затем следующая строка кода
long TenantID = -11132432026456784806;
выдает следующую ошибку
Error CS0023 Operator '-' cannot be applied to operand of type 'ulong'
Вот изображение тех же самых ошибок: ЗДЕСЬ
Я никогда не сталкивался с этим при работе на С# раньше. Обычно эти объявления работают нормально. Что-то не так с Visual Studio? Он продолжает считывать числа как UInt64, и при попытке привести их с помощью (Int64) или (long) возникает другая ошибка, заключающаяся в том, что UInt64 (или ulong) не может быть приведен к этим типам.
Келтен прав. В качестве обходного пути вы можете попробовать использовать вместо этого decimal
.
ulong
— это наименьший тип для этого значения... 9A7E57F227237FA6... Кто-то ответит со ссылкой на спецификацию, объясняющую это.
@Alexei: Ну, 11132432026456784806
можно хранить в ulong
. Но для этого вам нужно написать UInt64
вместо Int64
. -11132432026456784806, однако, не может быть сохранено в long
.
Для ulong
минимальное значение равно 0, а максимальное значение равно (2^64)-1. Для long
минимальное значение равно -(2^63), а максимальное значение равно (2^63)-1.
Говоря об идентификаторах клиентов Azure — это вовсе не целые числа, а идентификаторы GUID. Это даже больше битов, чем вы пытаетесь втиснуть в 64-битное (или 63-битное) целое число.
@Kalten Вы правы. Вот оно. По сути, парень, от которого я получил этот API, специально сделал число слишком большим, чтобы строка выдавала ошибку, чтобы я увидел ее и понял, что мне нужно обновить идентификатор арендатора.
Вы должны использовать «ulong», потому что поддержка 18.446.744.073.709.551.615.
Следуйте ссылке: https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/integral-numeric-types
Келтен прав. Числа, которые я пытаюсь присвоить, слишком велики для Int64 и слишком длинны. По сути, человек, от которого я получил этот API, намеренно сделал число слишком большим, чтобы строка выдавала ошибку, чтобы я увидел строку и понял, что мне нужно заменить ее своим собственным идентификатором.
Потому что 11132432026456784806 больше, чем long.MaxValue.