Как сделать класс (или структуру) в который можно было бы записать значение просто цифрой?

151
25 марта 2019, 22:00

Когда мы пишем
int a = 5;
Мы присваиваем a значение 5, но если я хочу сделать класс в который можно было бы ввести очень большое число написав именно
myclass a = 12345678987654321234567898765432123456789;
Нужно что бы класс или структура мог понимать присвоение этого набора символов(цифр), является ли это особенностью компилятора если так делать нельзя?

Answer 1

Ох, придётся дать свой ответ.

Перефразированный вопрос: как записать большое число вида 12345678987654321234567898765432123456789 литералом?

Ответ: это невозможно. Причина - ограничение компилятора.

Применяя неявное приведение типа implicit, максимум можно использовать ulong.Max.
Применяя BigInteger и ему подобные классы, придётся записывать такие большие числа в виде строки (строковый, а не числовой литерал).

Не исключено, что можно написать расширение на Roslyn API, которое позволит использовать такие большие значения. По сути, внести изменения в компилятор.

Answer 2

Нужно использовать операторы.
Например так:

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
Answer 3
  • Тебе это вообще не нужно. Двадцать раз подумай перед тем как это делать. Скорее всего ты просто усложняешь себе жизнь.
  • Существует 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%.

READ ALSO
C# работа с 2мя IP

C# работа с 2мя IP

Всем приветПодскажите кто чем может

467
Не работает запрос к web api. Как исправить?

Не работает запрос к web api. Как исправить?

Делаю учебную задачу, у меня есть удаленное хранилище ключей,, само апи это три запроса, гет , пост и делит, для создание api использую, Nancy, Aspnetcore,...

142
Подключение файлов в PHP множество раз

Подключение файлов в PHP множество раз

Всем доброго времени сутокЯ тут делаю плохую штуку

167