RU CSharp Keyword unmanaged generic type constraint - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#: unmanaged — обмеження параметра типу

Справочник C# · Практическое руководство

Ограничение where T : unmanaged разрешает только типы значений без управляемых ссылок в их составе. Оно позволяет использовать sizeof(T) и T* в разрешенном unsafe-контексте. Это ограничение типа, а не сделка вызова функции. Его не совмещают с отдельными struct или new().

Простой пример (Example.cs)

Сохраните этот пример отдельно как 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.

⚠️ **GitHub.com Fallback** ⚠️