Pergunta

Eu quero usar uma faixa de barra para alterar um formulário de opacidade.

Este é o meu código:

decimal trans = trackBar1.Value / 5000;
this.Opacity = trans;

Quando eu criar o aplicativo, ele dá o seguinte erro:

Não é possível converter implicitamente o tipo de 'decimal' para 'double'.

Eu tentei usar trans e double mas, em seguida, o controle não funciona.Esse código funcionou bem em um passado VB.NET projeto.

Foi útil?

Solução

De uma conversão explícita para o casal, como isso não é necessário:

double trans = (double) trackBar1.Value / 5000.0;

Identificar a constante de como 5000.0 (ou como 5000d é suficiente:

double trans = trackBar1.Value / 5000.0;
double trans = trackBar1.Value / 5000d;

Outras dicas

Mais genérico resposta para a pergunta genérica "Decimal vs Dupla?": Decimal para monetária cálculos para preservar a precisão, Duplo para cálculos científicos, que não são afetados por pequenas diferenças.Desde Double é um tipo que é nativo da CPU (representação interna é armazenado em base 2), os cálculos feitos com o Dobro de desempenho melhor, em seguida, Decimal (que é representado na base 10 internamente).

O código funcionou bem em VB.NET porque implicitamente faz qualquer casts, enquanto o C# tem implícita e explícita queridos.

Em C# a conversão de decimal para o casal é explícita quanto você perder a precisão.Por exemplo, 1.1 não pode ser precisamente expressa como um casal, mas pode como um valor decimal (ver "Números em ponto flutuante - mais imprecisas do que você pensa"a razão por que).

No VB a conversão foi adicionado para você pelo compilador:

decimal trans = trackBar1.Value / 5000m;
this.Opacity = (double) trans;

Que (double) tem de ser explicitamente declarado em C#, mas pode ser implícita por VB é mais 'perdoar' compilador.

Por que vocês estão dividindo por 5000?Basta definir a barra de controle Mínimo e Máximo de valores entre 0 e 100 e, em seguida, divida o Valor por 100 para a porcentagem de Opacidade.O mínimo de 20 exemplo abaixo impede o formulário de tornar-se completamente invisível:

private void Form1_Load(object sender, System.EventArgs e)
{
    TrackBar1.Minimum = 20;
    TrackBar1.Maximum = 100;

    TrackBar1.LargeChange = 10;
    TrackBar1.SmallChange = 1;
    TrackBar1.TickFrequency = 5;
}

private void TrackBar1_Scroll(object sender, System.EventArgs e)
{
    this.Opacity = TrackBar1.Value / 100;
}

Você tem dois problemas.Primeiro, Opacity requer um casal, não um valor decimal.O compilador está dizendo que enquanto não houver uma conversão entre decimal e dupla, é uma conversão explícita de que você precisa especificar em ordem para que ele funcione.A segunda é que TrackBar.Value é um valor inteiro e dividir um inteiro por um int resulta em um int, não importa que tipo de variável que você atribua a ele.Neste caso, há uma conversão implícita de int para decimal ou duas vezes porque não há nenhuma perda de precisão ao fazer o cast para que o compilador não reclamar, mas o valor que você recebe é sempre 0, presumivelmente, uma vez que trackBar.Value é sempre menor do que 5000.A solução é alterar o código para usar o dobro (o tipo nativo de Opacidade) e fazer aritmética de ponto flutuante explicitamente fazendo o constante de um casal - o que terá o efeito de promover a aritmética ou fundição trackBar.Value a dupla, que vai fazer a mesma coisa - ou de ambos.Ah, e você não precisa de intermediário variável, a menos que usado em outro lugar.Meu palpite é que o compilador iria otimizá-lo de distância, de qualquer forma.

trackBar.Opacity = (double)trackBar.Value / 5000.0;

Na minha opinião, é desejável para ser tão explícita quanto possível.Isso adiciona a clareza do código e da sida seus colegas programadores que, eventualmente, podem lê-lo.

Além de (ou em vez de) acrescentando um .0 o número, você pode usar decimal.ToDouble().

Aqui estão alguns exemplos:

// Example 1
double transperancy = trackBar1.Value/5000;
this.Opacity = decimal.ToDouble(transperancy);

// Example 2 - with inline temp
this.Opacity = decimal.ToDouble(trackBar1.Value/5000);

Parece this.Opacity é um valor duas vezes, e o compilador não gosta de você tentar inserir um valor decimal para ele.

Você deve usar 5000.0 em vez de 5000.

O Opacidade propriedade é do tipo double:

double trans = trackBar1.Value / 5000.0;
this.Opacity = trans;

ou simplesmente:

this.Opacity = trackBar1.Value / 5000.0;

ou:

this.Opacity = trackBar1.Value / 5000d;

Observe que estou usando 5000.0 (ou 5000d) para forçar uma dupla divisão, pois trackBar1.Value é um número inteiro e ele iria realizar uma divisão de número inteiro e o resultado seria um número inteiro.

Assumindo que você está usando WinForms, Form.Opacity é do tipo double, assim que você deve usar:

double trans = trackBar1.Value / 5000.0;
this.Opacity = trans;

A menos que você precise o valor em outros lugares, é mais simples escrever:

this.Opacity = trackBar1.Value / 5000.0;

A razão, o controle não funciona quando você alterou o código para simplesmente ser um casal foi porque você tinha:

double trans = trackbar1.Value / 5000;

qual interpretou o 5000 como um número inteiro, e porque trackbar1.Value também é um número inteiro a sua trans o valor foi sempre zero.Explicitamente, tornando o valor numérico de um valor de ponto flutuante adicionando o .0 o compilador agora pode interpretar como um casal e realizar o cálculo apropriado.

A melhor solução é:

this.Opacity = decimal.ToDouble(trackBar1.Value/5000);

Desde Opacity é um valor duas vezes, gostaria apenas de utilização de um casal, desde o início, e não o elenco, mas certifique-se de usar um duplo ao dividir para você não perder nenhuma precisão

Opacity = trackBar1.Value / 5000.0;
this.Opacity = trackBar1.Value / 5000d;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top