Поделиться через


where (ограничение универсального типа) (справочник по C#)

Предложение where используется в определении универсального типа для указания ограничений типов, которые могут использоваться в качестве аргументов параметра типа, определенного в универсальном объявлении. Например, можно объявить универсальный класс MyGenericClass, чтобы параметр типа T реализовывал интерфейс IComparable<T>.

public class MyGenericClass<T> where T:IComparable { }

Примечание

Дополнительные сведения о применении предложения "where" в выражении запроса см. в разделе Предложение where (Справочник по C#).

Кроме ограничений интерфейса, предложение where может включать ограничение базового класса, указывающее, что тип должен обладать указанным классом в качестве базового (или являться этим классом), чтобы его можно было использовать как аргумент типа для этого универсального типа. Если такое ограничение используется, оно должно располагаться перед любыми другими ограничениями данного параметра типа.

class MyClass<T, U>
    where T : class
    where U : struct
{}

Предложение where также может включать ограничение конструктора. Можно создать экземпляр параметра типа с помощью нового оператора, однако для этого оператор типа должен быть ограничен ограничением конструктора new(). Ограничение new() указывает компилятору, что у любого типа предоставленных аргументов должен быть доступный конструктор без параметров или по умолчанию. Примеры.


    public class MyGenericClass<T> where T : IComparable, new()
    {
        // The following line is not possible without new() constraint:
        T item = new T();
    }

Ограничение new() располагается последним в предложении where.

При работе с несколькими параметрами типа используйте по одному предложению where для каждого параметра типа, например:

    interface IMyInterface
    {
    }

    class Dictionary<TKey, TVal>
        where TKey : IComparable, IEnumerable
        where TVal : IMyInterface
    {
        public void Add(TKey key, TVal val)
        {
        }
    }

Также можно прикреплять ограничения к параметрам типа универсальных методов, например:

public bool MyMethod<T>(T t) where T : IMyInterface { }

Обратите внимание, что синтаксис, описывающий ограничения параметра типа для делегатов, такой же, как и для методов:

delegate T MyDelegate<T>() where T : new()

Сведения об универсальных методах-делегатах см. в разделе Универсальные методы-делегаты.

Дополнительные сведения о синтаксисе и применении ограничений см. в разделе Ограничения параметров типа.

Спецификация языка C#

Дополнительные сведения см в Спецификация языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.

См. также

Ссылки

Введение в универсальные шаблоны. (Руководство по программированию на C#)

Ограничение new (Справочник по C#)

Ограничения параметров типа (Руководство по программированию на C#)

Основные понятия

Руководство по программированию на C#

Другие ресурсы

Справочник по C#