RU CSharp Keyword unmanaged generic type constraint - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
Справочник C# · Практическое руководство
Ограничение where T : unmanaged разрешает только типы значений без управляемых ссылок в их составе. Оно позволяет использовать sizeof(T) и T* в разрешенном unsafe-контексте. Это ограничение типа, а не сделка вызова функции. Его не совмещают с отдельными struct или new().
Сохраните этот пример отдельно как Example.cs. Запускайте его независимо от остальных примеров страницы.
Example.cs:
// PROJECT-EXAMPLE
int Size<T>() where T : unmanaged
{
unsafe { return sizeof(T); }
}
System.Console.WriteLine(Size<int>());Результат:
4
static int ByteSize<T>() where T : unmanaged;
static void Swap<T>(T* left, T* right) where T : unmanaged;Файл Example.csproj:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net10.0</TargetFramework>
<LangVersion>14.0</LangVersion>
<Nullable>enable</Nullable>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
</Project>Файл Program.cs:
using System;
public struct GridPoint { public int X; public int Y; }
internal static unsafe class Program
{
public static void Main()
{
Console.WriteLine(ByteSize<int>());
Console.WriteLine(ByteSize<GridPoint>());
}
private static int ByteSize<T>() where T : unmanaged => sizeof(T);
}Результат:
4
8
Файл Example.csproj:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net10.0</TargetFramework>
<LangVersion>14.0</LangVersion>
<Nullable>enable</Nullable>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
</Project>Файл Program.cs:
using System;
internal static unsafe class Program
{
public static void Main()
{
int left = 10;
int right = 25;
Swap(&left, &right);
Console.WriteLine($"{left},{right}");
}
private static void Swap<T>(T* left, T* right) where T : unmanaged
{
T temporary = *left;
*left = *right;
*right = temporary;
}
}Результат:
25,10
Официальный источник: Microsoft Learn.