Создаем портфолио за 1 месяц
К концу месяца: 4 классных проекта в вашем портфолио! Стоимость: 100$. Подробности...
1117 of 1492 menu
◀ ▶

Ограничение allows ref struct

В C# 13 после обычных условий для T можно указать allows ref struct - тогда аргументом типа может быть ref struct, например Span<int>. Без этого правила ref struct не подходят под параметр типа. Код с T должен соблюдать ref-безопасность: нельзя боксировать такой тип и хранить его в статическом поле.

Синтаксис

class Holder<T> where T : allows ref struct { public T Pass(T value) => value; }

Пример

Давайте прочитаем первый элемент Span<int> через обобщённый класс:

using System; class Pipe<T> where T : allows ref struct { public T Echo(T value) => value; } class Program { static void Main() { Span<int> data = stackalloc int[5] { 1, 2, 3, 4, 5 }; var pipe = new Pipe<Span<int>>(); var res = pipe.Echo(data); Console.WriteLine(res[0]); } }

Результат выполнения кода:

1

Пример

Давайте передадим свой ref struct в обобщённый метод:

using System; ref struct Marker { public int Code; } class Box<T> where T : allows ref struct { public T Store(T value) => value; } class Program { static void Main() { var marker = new Marker { Code = 5 }; var box = new Box<Marker>(); var res = box.Store(marker); Console.WriteLine(res.Code); } }

Результат выполнения кода:

5

Пример

Давайте вернём аргумент из статического обобщённого метода:

using System; class Move { public static T Identity<T>(T value) where T : allows ref struct { return value; } } class Program { static void Main() { Span<int> src = stackalloc int[3] { 1, 2, 3 }; var res = Move.Identity(src); Console.WriteLine(res.Length); } }

Результат выполнения кода:

3

Смотрите также

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить