Возможно ли в C# создать свой тип **значений**?

Тип в C# - это, в целом, класс.

Типы делятся на типы значения и ссылочные типы. Типами значений являются, например, int, double, float, bool... Типами же ссылочными являются, например, class, interface или - в Юнити - GameObject, Transform и т.д.

Так вот, если переменную типа значения можно присвоить сразу: int a=3; bool b = false;, то переменные ссылочных типов инициализируются при помощи слова new: Cat cat = new Cat("Tom");.

Я хочу создать свой тип для хранения больших чисел. Он будет представлять числа больше миллиона в экспоненциальном формате, например, 3.67 E8 - это 3.67*10^8, т.е. 367000000.

Сейчас у меня есть такой класс:

public class LargeInt {
      public string Number;
    
(1)   public LargeInt (string number) => Number = number;
}

Его я могу инициализировоать с помощью конструктора через слово new: LargeInt price = new LargeInt("5 E10"), т.е. это ссылочный тип.

Возможно ли сделать так, чтобы класс инициализировался прямо: LargeInt price = "5 E10";?

Этот класс потом будет похож на обычный int. В нем будут функции ToString(), CompareTo(), операторы +,-... Потому что int не может работать с числами больше двух миллиардов с хвостиком.


Ответы (1 шт):

Автор решения: tym32167

User-defined conversion operators

Как пример

public class MyClass 
{
    public string Val {get; private set;} 
    public static implicit operator MyClass(string d) {
        var ret = new MyClass();
        ret.Val = d;
        return ret;
    }
}

Использование

MyClass myclass = "some text";
Console.WriteLine(myclass.Val);

Вывод

some text
→ Ссылка