Когда мы пишем
int a = 5;
Мы присваиваем a значение 5, но если я хочу сделать класс в который можно было бы ввести очень большое число написав именно
myclass a = 12345678987654321234567898765432123456789;
Нужно что бы класс или структура мог понимать присвоение этого набора символов(цифр), является ли это особенностью компилятора если так делать нельзя?
Ох, придётся дать свой ответ.
Перефразированный вопрос: как записать большое число вида 12345678987654321234567898765432123456789 литералом?
Ответ: это невозможно. Причина - ограничение компилятора.
Применяя неявное приведение типа implicit
, максимум можно использовать ulong.Max
.
Применяя BigInteger
и ему подобные классы, придётся записывать такие большие числа в виде строки (строковый, а не числовой литерал).
Не исключено, что можно написать расширение на Roslyn API, которое позволит использовать такие большие значения. По сути, внести изменения в компилятор.
Нужно использовать операторы.
Например так:
class MyClass
{
public int A { get; }
public MyClass()
{
}
public MyClass(int a)
{
A = a;
}
public static implicit operator MyClass(int a) => new MyClass(a);
}
И, соответственно, теперь можно использовать конструкцию создания экземпляра так:
MyClass my = 5;
Console.WriteLine(my.A); //5
Существует BigInteger, который поддерживает очень большие числа. Если BigInteger имеет в себе больше 50 чисел, то только 50 будет возвращено методом .ToString();
Если же нужно что бы было возвращено больше символов, нужно применить "R" format. То есть: SomeBigInteger.ToString("R");
возвратит без проблем полное значение, даже если там больше 50 символов в цифре.
Но представим себе ситуацию, что тебе это и вправду нужно. Только нужно иметь не BigInt, а BigFloat. Я бы сделал свой класс в котором бы хранилось 2 BigInt. А вся работа внутренняя была бы через строки(ну присвоение и возвращение теперешнего значения).
При присвоении значения - строка сплитилась бы на 2 части и каждая из частей бы присваивалась бы в свой собственный BigInt как целое и десятичное. Написать это нужно по тому принципу, как расписал LiptonDev в своем ответе.
Потом я реализовал бы собственные перезагруженные методы + - / *
Вот пример перегруженного метода умножения:
public static BigFloat operator *( BigFloat a, BigFloat b )
{
//реализация
}
внутри была бы реализация с учетом того, что наше число поделено на дробную и целую часть внутри твоего класса BigFloat.
Но повторюсь, тебе делать так не нужно. А если ты думаешь что нужно -- ты ошибаешся 100%.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Делаю учебную задачу, у меня есть удаленное хранилище ключей,, само апи это три запроса, гет , пост и делит, для создание api использую, Nancy, Aspnetcore,...