Ограничение class
В объявлении обобщённого типа или метода после
where T : class аргументом T может
быть класс, интерфейс, делегат или массив - но не
тип-значение. В nullable-контексте T считают
non-nullable ссылочным типом, а для проверки на
отсутствие ссылки используют null и
паттерн is null.
Синтаксис
class Имя<T> where T : class
{
}
void Метод<T>(T arg) where T : class
{
}
Пример
Давайте сохраним строку в обобщённом классе с
ограничением class:
using System;
class RefBox<T> where T : class
{
public T Value;
}
class Program
{
static void Main()
{
var box = new RefBox<string> { Value = "abcde" };
Console.WriteLine(box.Value);
}
}
Результат выполнения кода:
"abcde"
Пример
Давайте проверим ссылку на null через
is null:
using System;
class NullProbe<T> where T : class
{
public static string Describe(T? value)
{
return value is null ? "empty" : "set";
}
}
class Program
{
static void Main()
{
Console.WriteLine(NullProbe<string>.Describe(null));
Console.WriteLine(NullProbe<string>.Describe("12345"));
}
}
Результат выполнения кода:
"empty"
"set"
Пример
Давайте передадим массив - он тоже ссылочный тип:
using System;
class FirstCell<T> where T : class
{
public static string Read(T[] items)
{
return items[0];
}
}
class Program
{
static void Main()
{
string[] rows = { "abcde", "12345" };
Console.WriteLine(FirstCell<string>.Read(rows));
}
}
Результат выполнения кода:
"abcde"
Смотрите также
-
ограничение struct,
которое допускает только тип-значение -
ограничение notnull,
которое запрещает null для аргумента типа -
ключевое слово
class,
которое объявляет ссылочный тип -
тип
string,
который часто подставляют вместоTсclass