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


Ограничения (F#)

В этом разделе описываются ограничения, которые можно применять к параметрам универсального типа для задания требований к аргументу типа в универсальном типе или функции.

type-parameter-list when constraint1 [ and constraint2]

Заметки

Существует несколько различных ограничений, которые можно применять для ограничения количества типов, которые могут быть использованы в универсальном типе. Эти ограничения приведены в следующей таблице.

Ограничение

Синтаксис

Описание

Ограничение типа

type-parameter :> type

Переданный тип должен быть равен указанному типу или быть производным от него либо, если тип является интерфейсом, переданный тип должен реализовать интерфейс.

Ограничение по значению NULL

type-parameter : null

Переданный тип должен поддерживать литерал NULL. К таким типам относятся все типы объектов .NET, но не относятся типы списков, кортежей, функций, классов, записей и объединений F#.

Ограничение по явному члену

type-parameter [или ... или type-parameter] : member-signature

Хотя бы один из переданных аргументов типа должен иметь член, имеющий заданную сигнатуру; это ограничение не предназначено для широкого использования.

Ограничение по конструктору

type-parameter : ( new : unit -> 'a )

Переданный тип должен иметь конструктор по умолчанию.

Ограничение по типу значения

: struct

Переданный тип должен быть типом значения .NET.

Ограничение по ссылочному типу

: not struct

Переданный тип должен быть ссылочным типом .NET.

Ограничение по типу перечисления

: enum<underlying-type>

Переданный тип должен быть перечислимым типом, имеющим заданный базовый тип; это ограничение не предназначено для широкого использования.

Ограничение по делегату

: delegate<tuple-parameter-type, return-type>

Переданный тип должен быть типом делегата, имеющим заданные аргументы и возвращаемое значение; это ограничение не предназначено для широкого использования.

Ограничение по сравнению

: comparison

Переданный тип должен поддерживать сравнение.

Ограничение по равенству

: equality

Переданный тип должен поддерживать равенство.

Ограничение по неуправляемому типу

: unmanaged

Переданный тип должен быть неуправляемым типом. Неуправляемые типы — это некоторые примитивные типы (sbyte, byte, char, nativeint, unativeint, float32, float, int16, uint16, int32, uint32, int64, uint64 или decimal), типы перечисления, nativeptr<_> или неуниверсальная структура, все поля которой являются неуправляемыми типами.

Добавлять ограничение нужно тогда, когда код должен использовать возможность, доступную для ограниченного типа, но не для типов в общем. Например, если используется ограничение типа для указания типа класса, в универсальной функции или типе можно использовать любой из методов этого класса.

Задание ограничений иногда необходимо при явном написании параметров типа, поскольку без ограничения компилятор не может проверить, будут ли используемые возможности доступны в том или ином из типов, который может быть передан в качестве параметра типа во время выполнения.

Чаще всего в коде F# используются ограничения типа, которые задают базовые классы или интерфейсы. Остальные ограничения либо используются в библиотеке F# для реализации определенной функциональности (например, ограничение по явному члену, которое используется для реализации перегрузки операторов для арифметических операторов), либо предусмотрены главным образом потому, что язык F# поддерживает полный набор ограничений, поддерживаемый средой CLR.

В процессе определения типа некоторые ограничения автоматически выводятся компилятором. Например, если в функции используется оператор +, компилятор выводит ограничение по явному члену для типов переменных, используемых в выражении.

См. также

Ссылки

Универсальные шаблоны (F#)

Ограничения (F#)