Share via


Extensões de tipo (F#)

Extensões de tipo permitem que você adicionar novos membros a um tipo de objeto definido anteriormente.

// Intrinsic extension.
type typename with
   member self-identifier.member-name =
      body
   ...
   [ end ]

// Optional extension.
type typename with
   member self-identifier.member-name =
      body
   ...
   [ end ]

Comentários

Há duas formas de extensões de tipos que têm o comportamento e a sintaxe um pouco diferente. Um intrínseca extensão é uma extensão que apareça no mesmo namespace ou módulo, no mesmo arquivo de origem e no mesmo assembly (DLL ou arquivo executável) como o tipo que está sendo estendido. Um extensão opcional é uma extensão que aparece fora do módulo de original, o namespace ou assembly do tipo que está sendo estendido. Extensões intrínsecas aparecem no tipo quando o tipo é examinado pela reflexão, mas não extensões opcionais. Extensões opcionais devem ser em módulos e são somente no escopo quando o módulo que contém a extensão está aberto.

Na sintaxe anterior, typename representa o tipo que está sendo estendido. Pode ser estendido a qualquer tipo que pode ser acessado, mas o nome de tipo deve ser um nome de tipo real, não é uma abreviação de tipo. Você pode definir vários membros na extensão de um tipo. O self-identifier representa a instância do objeto que está sendo chamado, assim como nos membros comuns.

O end palavra-chave é opcional na sintaxe leve.

Membros definidos nas extensões de tipo podem ser usados da mesma forma que outros membros em um tipo de classe. Como outros membros podem ser estáticos ou membros de instância. Esses métodos também são conhecidos como métodos de extensão; propriedades são conhecidas como Propriedades de extensãoe assim por diante. Membros de extensão opcionais são compilados para membros estáticos para o qual a instância do objeto é passada implicitamente como o primeiro parâmetro. No entanto, eles agem como se fossem membros de instância ou membros estáticos de acordo com como elas são declaradas. Membros de extensão implícitas são incluídos como membros do tipo e podem ser usados sem restrição.

Os métodos de extensão não podem ser métodos virtuais ou abstratos. Pode sobrecarregar os outros métodos de mesmo nome, mas o compilador dá preferência para os métodos de extensão de não no caso de uma chamada ambígua.

Se várias extensões de tipo intrínseco existirem para um tipo, todos os membros devem ser exclusivos. Para as extensões de tipo opcional membros nas extensões de tipo diferente para o mesmo tipo podem ter os mesmos nomes. Os erros de ambigüidade ocorrem somente se o código do cliente abre os dois escopos diferentes que definem os mesmos nomes de membro.

No exemplo a seguir, um tipo em um módulo tem uma extensão de tipo intrínseco. O código de cliente fora do módulo, a extensão do tipo é exibido como um membro regular do tipo em todos os aspectos.

module MyModule1 =

    // Define a type.
    type MyClass() =
      member this.F() = 100

    // Define type extension.
    type MyClass with
       member this.G() = 200

module MyModule2 =
   let function1 (obj1: MyModule1.MyClass) =
      // Call an ordinary method.
      printfn "%d" (obj1.F())
      // Call the extension method.
      printfn "%d" (obj1.G())

Você pode usar as extensões de tipo intrínseco para separar a definição de um tipo em seções. Isso pode ser útil no gerenciamento de definições de tipo grande, por exemplo, para manter separado o código gerado pelo compilador e criados ou agrupar o código criado por pessoas diferentes ou associado com uma funcionalidade diferente.

No exemplo a seguir, uma extensão de tipo opcional estende o System.Int32 tipo de um método de extensão FromString que chama o membro estático Parse. O testFromString método demonstra que o novo membro é chamado, assim como qualquer membro de instância.

// Define a new member method FromString on the type Int32.
type System.Int32 with
    member this.FromString( s : string ) =
       System.Int32.Parse(s)

let testFromString str =  
    let mutable i = 0
    // Use the extension method.
    i <- i.FromString(str)
    printfn "%d" i

testFromString "500"

O novo membro de instância aparecerá como qualquer outro método do Int32 o tipo IntelliSense, mas somente quando o módulo que contém a extensão está aberta ou de outra forma no escopo.

Consulte também

Conceitos

Membros (F#)

Outros recursos

Referência de linguagem do F#