TGViewer
.NET Разработчик .NET Разработчик @netdeveloperdiary · 6.75K subscribers
Post #1155 1.44K
День девятьсот тридцать девятый. #ЧтоНовенького
Превью Функции в .NET 6. Начало
В .NET 6 представлены несколько новых функций, пока в виде превью. Это значит, что они не поддерживаются для использования в производственной среде в .NET 6. Они пока выпущены для оценки сообществом и предоставления обратной связи относительно сценариев их использования и возможных улучшений.

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

1. Статические абстрактные члены интерфейсов
Как видно из названия, это означает, что теперь вы можете объявлять статические абстрактные методы как часть интерфейса и реализовывать их в производном типе. Простой, но мощный пример этого - IParseable, который позволяет определять контракт парсинга строки для создания данного типа:
public interface IParseable<TSelf>
where TSelf : IParseable<TSelf> {
static abstract TSelf Parse(
string s,
IFormatProvider? provider);

static abstract bool TryParse(
[NotNullWhen(true)] string? s,
IFormatProvider? provider,
out TSelf result);
}

public readonly struct Guid : IParseable<Guid>
{
public static Guid Parse(
string s, IFormatProvider? provider)
{
/* Реализация */
}

public static bool TryParse(
[NotNullWhen(true)] string? s,
IFormatProvider? provider, out Guid result)
{
/* Реализация */
}
}

Особенности:
- Теперь вы можете объявлять элементы интерфейса, которые одновременно являются статическими и абстрактными.
- В настоящее время это не поддерживается для методов интерфейса с реализацией по умолчанию, поэтому сочетание static virtual не является допустимой комбинацией.
- Эта функциональность доступна только для интерфейсов, она недоступна для других типов, таких как абстрактный класс.
- Эти члены недоступны через интерфейс, то есть IParseable<Guid>.Parse(someString, null) приведет к ошибке компиляции.

Поясним последний пункт. Обычно абстрактные или виртуальные члены вызываются через какую-либо виртуальную диспетчеризацию (при полиморфном использовании). Для статических методов у нас нет объекта или экземпляра, поэтому среда выполнения не сможет определить, что IParseable<Guid>.Parse(…) должно разрешиться в Guid.Parse. Чтобы это работало, нужно где-то указать фактический тип, и это можно сделать с помощью дженериков:
public static T InvariantParse<T>(string s)
where T : IParseable<T>
{
return T.Parse(s, CultureInfo.InvariantCulture);
}

В этом случае среда выполнения может определить, какой метод Parse следует разрешить, подсмотрев его на конкретном используемом T. Если пользователь указал InvariantParse<int>(someString), он будет преобразован в метод Parse из System.Int32. А InvariantParse<Guid>(someString) будет преобразован в метод Parse из System.Guid и так далее.

Более подробную информацию об изменениях среды выполнения, внесённых для поддержки этой функции, можно найти здесь.

Продолжение следует…

Источник:
https://devblogs.microsoft.com/dotnet/preview-features-in-net-6-generic-math/
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 →