Share via


CS0029 de erro do compilador

Mensagem de erro

Não é possível converter implicitamente o tipo 'tipo' para 'tipo'

O compilador requer uma conversão explícita.Por exemplo, talvez você precise converter um r-value ser o mesmo tipo sistema autônomo um valor l.Ou, você deve fornecer rotinas de conversão para dar suporte a determinados sobrecargas de operador.

Conversões devem ser igual ao atribuir uma variável de um tipo a uma variável de um tipo diferente.Quando você faz uma atribuição entre variáveis de tipos diferentes, o compilador deve converter o tipo no lado direito do operador de atribuição para o tipo no lado esquerdo do operador de atribuição.Faça o seguinte código:

int i = 50;
long lng = 100;
i = lng;

i = lng; faz uma atribuição, mas os dados não correspondem aos tipos de variáveis no lado esquerdo e direito do operador de atribuição. Antes de fazer a atribuição o compilador é converter implicitamente a variável lng, que é do tipo longo, para int. Isso é implícito porque nenhum código explicitamente instruído o compilador para realizar essa conversão.O problema com esse código é que ela é considerada uma conversão de restrição e o compilador não permite conversões implícitas restrição porque pode haver uma potencial perda de dados.

Uma conversão de restrição existe durante a conversão em um tipo de dados que ocupa menos espaço de armazenamento na memória do que o tipo de dados que estiver convertendo de.Por exemplo, conversão de uma longa em um int seria considerado uma conversão de restrição.Um longo ocupa 8 bytes de memória enquanto um int ocupa 4 bytes.Para ver como pode ocorrer perda de dados, considere o exemplo a seguir:

int i = 50;
long lng = 3147483647;
i = lng;

A variável lng agora contém um valor que não pode ser armazenado na variável i porque é muito grande. Se fôssemos converter esse valor para um tipo int poderia ser perder alguns dos nossos dados e o valor convertido não poderia ser igual ao valor antes da conversão.

Uma conversão de expansão seria o oposto de uma conversão de restrição.Com o alargamento conversões, nós está convertendo a um tipo de dados ocupa mais espaço de armazenamento na memória que o tipo de dados que estiver convertendo de.Eis um exemplo de uma conversão de expansão:

int i = 50;
long lng = 100;
lng = i;

Observe a diferença entre este exemplo de código e o primeiro.Dessa vez a variável lng está no lado esquerdo de operador de atribuição, portanto, é o destino de nosso atribuição. Antes que possa ser feita a atribuição, o compilador deve converter implicitamente a variável i, que é do tipo int, digitar o tempo. Isso é uma conversão de expansão, pois nós estiver convertendo de um tipo que ocupa 4 bytes de memória (um int) para um tipo que ocupa 8 bytes de memória (muito).Expansão de conversões implícitas são permitidas porque não há nenhum potencial perda de dados.Qualquer valor que pode ser armazenado em um int também pode ser armazenado em um longo.

Sabemos que não são permitidas conversões implícitas de restrição, portanto, ser capaz de compilar este código precisamos converter explicitamente o tipo de dados.Conversões explícitas são feitas usando a projeção.A conversão é o termo usado em translation from VPE for Csharp para descrever a conversão de um tipo de dados para outro.Para obter o código para compilar seria necessário usar a seguinte sintaxe:

int i = 50;
long lng = 100;
i = (int) lng;   // cast to int

A terceira linha de código informa ao compilador para converter a variável explicitamentelng, que é do tipo tempo para ser um inteiro antes de fazer a atribuição. Lembre-se de que com uma conversão de restrição, há uma potencial perda de dados.Restringir conversões deve ser usada com cuidado e mesmo que o código será compilado podem obter resultados inesperados em time de execução.

Essa discussão foi apenas por tipos de valor.Ao trabalhar com tipos de valor que você trabalha diretamente com os dados armazenados na variável.No entanto, o .NET estrutura também possui tipos de referência.Ao trabalhar com tipos de referência que você está trabalhando com uma referência a uma variável, não os dados real.Exemplos de tipos de referência seria classes, interfaces e arrays.Não é possível implicitamente ou explicitamente converter um tipo de referência para outro, a menos que o compilador permite a conversão específica ou a conversão apropriada operadores são implementados.

O exemplo a seguir gera CS0029:

// CS0029.cs
public class MyInt
{
    private int x = 0;    

    // Uncomment this conversion routine to resolve CS0029
    /*
    public static implicit operator int(MyInt i)
    {
       return i.x;
    }
    */
   

    public static void Main()
   {
      MyInt myInt = new MyInt();
      int i = myInt; // CS0029
   }
}

Consulte também

Referência

Operadores de conversão (Guia de programação C#)