LINUX.ORG.RU

IArithmetic<T>

 ,


0

2

В .NET числовые типы не имею общего интерфейса (такого, как Number в Java) с операторами либо функциями сложения, вычитания и прочими, что делает невозможным/проблематичным создание Generic функций для работы с коллекциями чисел. На StackOverflow нашел упоминания о предложениях ввести IArithmetic<T> и даже на наличие его в исходниках (но в закомментированном виде), но эти предложения были отклонены. Известно ли почему?



Последнее исправление: Uter (всего исправлений: 1)

Есть подозрение, что это из-за того, что числовые типы представлены как value type и имеют присущие им ограничения. Навскидку не помню, может ли value type реализовывать интерфейс.

Dark_SavanT ★★★★★
()
Ответ на: комментарий от Dark_SavanT

Навскидку не помню, может ли value type реализовывать интерфейс.

Если речь о структурах, то да, структура может реализовать интерфейс. Только есть один важный момент. Если структура используется через интерфейс, т.е. неизвестно, что это именно структура, но известно, что это некий объект, реализующий интерфейс, то тогда происходит боксинг. Другими словами, значение помещается в кучу. И плохо то, что это происходит неявно.

Собственно, боксинг - основная проблема для интерфейса IArithmetic<T>, которого желает наш автор.

dave ★★★★★
()
Ответ на: комментарий от dave

Собственно, боксинг - основная проблема для интерфейса IArithmetic<T>

Ага, понял.

Погадаем на кофейной гуще?

Будет ли что нибудь придумано по этому поводу в следующих версиях? И как это обходится сейчас?

Uter
() автор топика
Последнее исправление: Uter (всего исправлений: 1)
Ответ на: комментарий от ebantrop

Ну, там дело в том, что в случае использовании структуры p и employee указывают на две разные сущности. Employee сидит на стеке, p указывает на кучу. По крайней мере, я бы понял такую реализацию .net :)

dave ★★★★★
()
Ответ на: комментарий от Uter

Можно и погадать :)

Такое поведение существует официально с .net 1.0 (еще когда было принято в msdn ставить фигурные скобки в c# как в java, т.е. начинать на той же строке, а не как сейчас - в отдельной). Нет причин думать, что что-то измениться.

Да, и зачем обходить? В Scala что-то есть подобное, но я не знаю, насколько широко там используется Numeric. Нет, конечно, забавна идея использовать Numeric[T] как класс типов, но нафига это нужно даже в Scala, если инструмент получился довольно дорогой из-за боксинга? Да, там тоже боксинг.

dave ★★★★★
()
Ответ на: комментарий от dave

Да не. Просто все операции со структурами они by value, классы by reference. Если сделать p = ref employee, или как там говорят Employee сделать классом, то все будет работать.

ebantrop
()
Ответ на: комментарий от Uter

Будет ли что нибудь придумано по этому поводу в следующих версиях?

Вряд ли. На stackoverflow вроде был где то пример, вроде даже как то работало.

И как это обходится сейчас?

Я тупо кодогенерю, когда такое надо.

ebantrop
()
Ответ на: комментарий от ebantrop

Каждый находит свое объяснение, тем более, в формате одного-двух предложений, а больше и не принято писать на ЛОРе ;)

dave ★★★★★
()

общий интерфейс числового типа это как?

public class ExtInt{

public static getHello(this int){Consile.WriteLine("Hello int");}
} 

и тогда можно

int.getHello();

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.