Пользовательский тип данных C#! [дубликат]

Возможные Дубликаты:
Int128 в .Net?

после того, как я решил реализовать свой Int128 в C#, я подумал, что было бы неплохо сделать его похожим на другие типы данных dotNet.. Но я не смог реализовать следующую функцию:

  • инициализация суффикса: например, 13L и 0.2 D

могу ли я сделать свой собственный суффикс в C#?
А если не смогу.. как его инициализировать?
я.е

Int128 a= ??

4 ответов


вы не можете создать свои собственные инициализаторы суффиксов - это часть языка и запеченный в компилятор. С другой стороны, если вы пишете свой собственный компилятор C#, вы можете делать все, что хотите, и расширять его любым способом.

Что касается того, как вы его инициализируете - это зависит от того, как вы его написали. Если это класс, вам нужно будет инициализировать его с помощью new ключевое слово или напишите некоторые неявные преобразования в числовые типы, которые имеют меньше точность.

как отметил Джон, у вас не будет возможности установить его на значение больше, чем ulong.MaxValue без некоторых манипуляций со строками. Вам также придется представлять in внутренне в какой-то форме (string? Ряд ulongs?) и убедитесь, что все преобразования и операции работают правильно (насчет переполнения?).


нет, вы не можете создать свою собственную форму литерала в C#.

вы мог бы есть неявное преобразование из int, long, uint и ulong, что позволяет:

Int128 a = 100;

но вы не сможете указать значение больше ulong.MaxValue этак.

наличие неявного преобразования из decimal позволит увеличить диапазон, но будет плохой идеей, потому что вы потеряете данные для любого значения, которое не было просто целое число.

в основном нет ничего, что позволит литералу гарантированно быть целочисленным значением больше, чем ulong.MaxValue - вы могли разобрать строку, но это не совсем подходит. В качестве альтернативы вы можете создать конструктор, который взял два ulongs, один для нижних 64 бит и один для верхних 64 бит.


нет, вы не можете выполнить инициализацию суффикса. Этот бит привлекательности будет доступен в предстоящем стандарте C++... но я отвлекся.

самый очевидный выбор Int128(long hi, ulong lo) и Int128(string).


вы можете посмотреть на новую структуру BigInteger в 4.0 для советов по инициализации. http://msdn.microsoft.com/en-us/library/system.numerics.biginteger.aspx