Есть ли статическое поле, эквивалентное расширениям? - PullRequest
0 голосов
/ 23 сентября 2019

Для универсального класса, foo<T> Я могу указать методы, которые доступны только для определенных типов класса, например,

public static void(this foo<int> val) является допустимым объявлением, как

public static void(this foo<float> val) и, таким образом, я могу указать различные поведения для универсального, который я намерен использовать одним и тем же способом, обрабатывая разницу между ними в их отдельных методах.Наиболее полезным случаем этого является добавление арифметических функций к векторам, матрицам и наборам, в то же время оставляя их общими.(Поскольку по какой-то божьей причине все еще нет INumeric-ограничения для определения только типов, которые поддерживают основные операторы)

Есть ли эквивалентные функциональные возможности для статических переменных.Цель состоит в том, чтобы я мог выполнить следующее:

foo<int>.Zero и foo<float>.Zero, и каждый из них должен быть различным и не конфликтовать друг с другом, возвращая foo соответствующего типа, но без броскаошибки в случае, когда foo<bar>.Zero из-за отсутствия понятия «ноль» для объекта, подобного bar

1 Ответ

0 голосов
/ 23 сентября 2019

C # не предоставляет синтаксис, который позволяет вам определять поля для расширений свойств или статические расширения для классов.

Для этого вам следует использовать некоторое статическое свойство, например foo.ZeroOfFloat, в качестве некоторых стандартных API C #определены следующим образом.

Это выглядит очень красиво и чисто, когда вы используете более общие вещи, но это не правильный вариант использования универсального.

«Универсальный» означает, что он является общим, для использования типа unrelavent, поэтому он отличается от определений шаблонов в C ++, который поддерживает специализацию.Технически, универсальные определения в C # компилируются и доставляются как IL, а не как исходный код в C ++, что означает, что компиляция происходит до того, как определенный тип подключен к универсальному определению, и не может быть специализации для одного типа.

Хотя существуют некоторые общие ограничения для ссылочных типов, типов значений, делегатов или собственных структур и т. Д., Которые ограничивают использование общего определения некоторыми типами типов.Это запрещает некоторые варианты использования, а не поддерживает что-то.

Хотя вы можете использовать это, могут быть разные методы расширения для универсального типа, который закрыт аргументами другого типа (что дает вам ощущение специализации шаблона).), то есть не задумано.

Не достигайте определенной логики в общем определении.Определения, такие как ZeroOfFloat, никогда не бывают плохими.

...