Restrições (F#)
Este tópico descreve restrições que você pode aplicar a genérica digite parâmetros para especificar os requisitos para o argumento de tipo em um tipo genérico ou função.
type-parameter-list when constraint1 [ and constraint2]
Comentários
Há várias restrições diferentes, que você pode aplicar para limitar os tipos que podem ser usados em um tipo genérico. A tabela a seguir lista e descreve essas restrições.
Restrição |
Sintaxe |
Descrição |
---|---|---|
Restrição de tipo |
type-parameter :> type |
O tipo fornecido deve ser igual ou derivado do tipo especificado ou, se o tipo é uma interface, o tipo fornecido deve implementar a interface. |
Restrição nula |
type-parameter : Nulo |
O tipo fornecido deve suportar o literal nulo. Isso inclui todos os.Tipos de objeto NET mas não F# a lista, tupla, função, classe, registro ou tipos de união. |
Restrição explícitos de membro |
type-parameter[ou... or type-parameter] : member-signature |
Pelo menos um dos argumentos de tipo fornecidos deve ter um membro que possui a assinatura especificada; não se destina a uso comum. |
Restrição de construtor |
type-parameter : (novo: unidade - > um) |
O tipo fornecido deve ter um construtor padrão. |
Restrição de tipo de valor |
: struct |
O tipo fornecido deve ser um.Tipo do valor líquido. |
Restrição de tipo de referência |
: não struct |
O tipo fornecido deve ser um.Tipo de referência NET. |
Restrição de tipo de enumeração |
: Enum <underlying-type> |
O tipo fornecido deve ser um tipo enumerado que tem o tipo base especificado; não se destina a uso comum. |
Restrição de delegado |
: Delegar <tuple-parameter-type, return-type> |
O tipo fornecido deve ser um tipo delegado que tem os argumentos especificados e retornar o valor; não se destina a uso comum. |
Restrição de comparação |
: comparação |
O tipo fornecido deve oferecer suporte a comparação. |
Restrição de igualdade |
: Igualdade |
O tipo fornecido deve oferecer suporte a igualdade. |
Restrição não gerenciada |
: não gerenciado |
O tipo fornecido deve ser um tipo não gerenciado. Tipos não gerenciados são determinados tipos de primitivos (sbyte, byte, char, nativeint, unativeint, float32, float, int16, uint16, int32, uint32, int64, uint64, ou decimal), tipos de enumeração nativeptr<_>, ou uma estrutura não genéricas, cujos campos sejam todos os tipos de não gerenciado. |
Você precisa adicionar uma restrição quando seu código tem que usar um recurso disponível no tipo de restrição mas não em tipos em geral. Por exemplo, se você usar a restrição de tipo para especificar um tipo de classe, você pode usar qualquer um dos métodos da classe na função genérica ou tipo.
Especificar restrições é às vezes necessário ao escrever os parâmetros de tipo explicitamente, porque sem uma restrição, o compilador não tem meios de verificar que os recursos que você está usando será disponíveis em qualquer tipo que pode ser fornecido em tempo de execução para o parâmetro de tipo.
As restrições mais comuns que você pode usar no código do F# são as restrições de tipo especificar interfaces ou classes base. Restrições de ambos são usadas pela biblioteca de F# para implementar determinadas funcionalidades, como, por exemplo, a restrição de membro explícito, que é usada para implementar o sobrecarregamento de operadores aritméticos ou é fornecida principalmente porque o F# suporta o conjunto completo de restrições que é suportado pelo common language runtime.
Durante o processo de inferência de tipo, algumas restrições são inferidas automaticamente pelo compilador. Por exemplo, se você usar o + o operador em uma função, o compilador infere uma restrição de membro explícito em tipos de variáveis que são usados na expressão.