Ограничение 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
Смотрите также
-
ограничение unmanaged,
которое задаёт неуправляемый тип-значение -
ограничение struct,
которое не заменяетallows ref struct -
параметр типа,
к которому добавляют анти-ограничение -
тип
int,
который входит вSpan<int>