TGViewer
.NET Разработчик .NET Разработчик @netdeveloperdiary · 6.75K subscribers
Post #1156 1.47K
День девятьсот сороковой. #ЧтоНовенького
Превью Функции в .NET 6. Продолжение
Начало

2. Обобщённая математика
Одна из давно востребованных функций .NET - это возможность использовать операторы для обобщённых типов. Нововведение добавляет возможность писать обобщённый код относительно, например, числовых типов, на которые наложены ограничения в виде интерфейсов с нужными операторами. Таким образом, алгоритмы могут выражены в следующем виде:
// Интерфейс определяет статические свойства и операторы
interface IAddable<T> where T : IAddable<T>
{
static abstract T Zero { get; }
static abstract T operator +(T t1, T t2);
}

// Классы и структуры (включая встроенные) реализуют интерфейс
struct Int32 : …, IAddable<Int32>
{
public static Int32 operator +(Int32 x, Int32 y)
=> x + y;
public static Int32 Zero => 0;
}

// Обобщённые алгоритмы могут использовать статические члены типа Т
public static T AddAll<T>(T[] ts)
where T : IAddable<T>
{
// вызов статического свойства
T result = T.Zero;
// вызов статического оператора +
foreach (T t in ts) { result += t; }
return result;
}

Это стало возможным благодаря появлению нескольких новых статических абстрактных интерфейсов, которые соответствуют различным операторам, доступным для языка, и предоставлению нескольких других интерфейсов, представляющих обобщённые функции, такие как синтаксический анализ или обработка чисел. Интерфейсы были разработаны для расширяемости и повторного использования и поэтому обычно представляют лишь отдельные операторы или свойства. Например, в одном интерфейсе не используются парные операции, такие как умножение и деление, поскольку они подходят не для всех типов. Matrix4x4*Matrix4x4 является допустимым, а Matrix4x4/Matrix4x4 - нет. Кроме того, интерфейсы обычно позволяют типам исходных данных и результата различаться, чтобы поддерживать такие сценарии, как double = TimeSpan/TimeSpan или Vector4 = Vector4*float.

Вот некоторые из новых интерфейсов:
- INumber – члены общие для числовых типов,
- IFloatingPoint – члены общие для чисел с плавающей точкой,
- IAdditionOperators – x+y,
- ISubtractionOperators – x–y,
- IMultiplyOperators – x*y,
- IDivisionOperators – x/y,
- IComparisonOperators – x<y, x>y, x<=y и x>=y,
- IEqualityOperators – x==y и x!=y,
- IIncrementOperators – ++x и x++.

Поскольку этот функционал пока находится в превью, существуют различные аспекты, которые все ещё находятся в стадии разработки и могут измениться к следующей превью версии или после официального релиза. Также могут быть добавлены новые концепции, такие как IConvertible<TSelf>, или интерфейсы для поддержки векторных типов и операций.

Источники:
-
https://devblogs.microsoft.com/dotnet/preview-features-in-net-6-generic-math/
-
https://habr.com/ru/post/572902/
  • 👍 1
More from @netdeveloperdiary
  1. Oct 7, 2026День 2807. #ЗаметкиНаПолях Типы Коллекций в .NET, Которые Стоит Попробовать. Окончание Нач…
  2. Oct 6, 2026🦈 Открытое собеседование на Middle C# | 6 октября, 19:00 МСК Приглашаем на открытое собес…
  3. Oct 6, 2026День 2806. #ЗаметкиНаПолях Типы Коллекций в .NET, Которые Стоит Попробовать. Начало Больши…
  4. Oct 5, 2026День 2805. #ЧтоНовенького #NET11 Аргументы в Выражениях Коллекций в C#15 В C#15 реализован…
  5. Oct 4, 2026День 2804. #ВопросыНаСобеседовании Марк Прайс предложил свой набор из 60 вопросов (как тех…
  6. Oct 3, 2026Post #3360
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →