DISABLE ADBLOCK

ADBlock está bloqueando parte del contenido en el sitio

ADBlock errore
resultados encontrados: 

Pregunta

Quiero usar una barra de desplazamiento para cambiar la opacidad de un formulario.

Este es mi código:

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

Cuando compilo la aplicación, da el siguiente error:

  

No se puede convertir implícitamente el tipo 'decimal' a 'double' .

Intenté usar trans y double pero el control no funciona. Este código funcionó bien en un proyecto VB.NET anterior.

Solución

Un lanzamiento explícito para doblar así no es necesario:

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

Identificar la constante como 5000.0 (o como 5000d ) es suficiente:

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

Si te gusta déjanos tu opinión

¿Fue útil el artículo y está traducido correctamente?

OTROS CONSEJOS

Una respuesta más genérica para la pregunta genérica " ¿Decimal vs Doble? " ;: Decimal para cálculos monetarios para preservar la precisión, Doble para cálculos científicos que no Se ven afectados por pequeñas diferencias. Como Double es un tipo que es nativo de la CPU (la representación interna se almacena en base 2 ), los cálculos realizados con Double funcionan mejor que Decimal (que se representa en base 10 internamente).

Su código funcionó bien en VB.NET porque implícitamente realiza cualquier conversión, mientras que C # tiene tanto implícitos como explícitos.

En C #, la conversión de decimal a doble es explícita a medida que pierde precisión. Por ejemplo, 1.1 no se puede expresar con precisión como doble, pero sí como decimal (vea " Números de punto flotante: más inexactos de lo que cree " por el motivo).

En VB, el compilador agregó la conversión para usted:

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

Ese (doble) debe establecerse explícitamente en C #, pero puede ser implícito por el compilador más perdonador de VB.

¿Por qué estás dividiendo por 5000? Simplemente establezca los valores Mínimo y Máximo de la Barra de navegación entre 0 y 100 y luego divida el Valor por 100 para el porcentaje de Opacidad. El mínimo de 20 ejemplos a continuación evita que la forma se vuelva completamente invisible:

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;
}

Tienes dos problemas. Primero, Opacity requiere un doble, no un valor decimal. El compilador le está diciendo que, si bien hay una conversión entre decimal y doble, es una conversión explícita que debe especificar para que funcione. La segunda es que TrackBar.Value es un valor entero y dividir un int por un int da como resultado un int sin importar a qué tipo de variable lo asigne. En este caso, hay una conversión implícita de int a decimal o doble, porque no hay pérdida de precisión cuando se realiza la conversión, por lo que el compilador no se queja, pero el valor que obtiene es siempre 0, probablemente, ya que trackBar.Value siempre es menor que 5000. La solución es cambiar su código para usar doble (el tipo nativo de Opacidad) y hacer aritmética de punto flotante haciendo explícitamente que la constante sea doble, lo que tendrá el efecto de promoviendo la aritmética - o lanzar trackBar.Value a doble, lo que hará lo mismo - o ambos. Ah, y no necesitas la variable intermedia a menos que se use en otros lugares. Supongo que el compilador lo optimizaría, de todos modos.

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

En mi opinión, es deseable ser lo más explícito posible. Esto agrega claridad al código y ayuda a sus compañeros programadores que eventualmente pueden leerlo.

Además de (o en lugar de) agregar un .0 al número, puede usar decimal.ToDouble () .

Aquí hay algunos ejemplos:

// 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 que this.Opacity es un valor doble, y al compilador no le gusta que intentes meter un valor decimal en él.

Debes usar 5000.0 en lugar de 5000 .

La propiedad Opacity es de tipo doble:

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

o simplemente:

this.Opacity = trackBar1.Value / 5000.0;

o:

this.Opacity = trackBar1.Value / 5000d;

Observe que estoy usando 5000.0 (o 5000d ) para forzar una división doble porque trackBar1.Value es un número entero y realizaría una división entera y el resultado sería ser un número entero.

Suponiendo que está utilizando WinForms, < code> Form.Opacity es de tipo double , por lo que debe usar:

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

A menos que necesite el valor en otro lugar, es más sencillo de escribir:

this.Opacity = trackBar1.Value / 5000.0;

La razón por la que el control no funciona cuando cambió su código para simplemente ser un doble fue porque tenía:

double trans = trackbar1.Value / 5000;

que interpretó el 5000 como un entero, y porque trackbar1.Value también es un entero, su valor de trans siempre fue cero. Al hacer explícitamente el valor de punto flotante numérico al agregar el .0 , el compilador ahora puede interpretarlo como un doble y realizar el cálculo correcto.

La mejor solución es:

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

Dado que Opacity es un valor doble, solo usaría un doble desde el principio y no se lanzaba en absoluto, pero asegúrese de usar un doble al dividir para que no pierda ninguna precisión

Opacity = trackBar1.Value / 5000.0;

this.Opacity = trackBar1.Value / 5000d;

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow