Quiero usar a Track-Bar
para cambiar Form
la opacidad de a.
Este es mi código:
decimal trans = trackBar1.Value / 5000;
this.Opacity = trans;
Cuando construyo la aplicación, aparece el siguiente error:
No se puede convertir implícitamente el tipo
decimal
adouble
He intentado usar trans
y double
pero luego Control
no funciona. Este código funcionó bien en un proyecto anterior de VB.NET.
c#
floating-point
type-conversion
double
decimal
Huevos McLaren
fuente
fuente
Respuestas:
No
double
es necesario un reparto explícito como este:Identificar la constante como
5000.0
(o como5000d
) es suficiente:fuente
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. Dado que Double es un tipo nativo de la CPU (la representación interna se almacena en la base 2 ), los cálculos realizados con Double funcionan mejor que Decimal (que se representa en la base 10 internamente).
fuente
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 puede expresarse con precisión como un doble, pero puede expresarse como un decimal (consulte " Números de coma flotante, más inexactos de lo que cree ", por la razón).
En VB, el compilador agregó la conversión para usted:
Eso
(double)
tiene que establecerse explícitamente en C #, pero puede estar implícito en el compilador más "tolerante" de VB.fuente
¿Por qué estás dividiendo entre 5000? Simplemente configure los valores Mínimo y Máximo de TrackBar 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 el formulario se vuelva completamente invisible:
fuente
5000
, OP tendría un problema con100
?Tienes dos problemas Primero,
Opacity
requiere un valor doble, no decimal. El compilador le dice que si bien hay una conversión entre decimal y doble, es una conversión explícita que debe especificar para que funcione. El segundo es queTrackBar.Value
es un valor entero y dividir un int por un int da como resultado un int sin importar a qué tipo de variable se 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 realiza la conversión, por lo que el compilador no se queja, pero el valor que obtiene siempre es 0, presumiblemente, ya quetrackBar.Value
siempre es inferior a 5000. La solución es cambiar su código para usar double (el tipo nativo de Opacity) y hacer aritmética de coma flotante al hacer explícitamente la constante doble, lo que tendrá el efecto de promover la aritmética, o convertirtrackBar.Value
a double , que hará lo mismo, o ambos. Ah, y no necesita la variable intermedia a menos que se use en otro lugar. Supongo que el compilador lo optimizaría de todos modos.fuente
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 usardecimal.ToDouble()
.Aquí hay unos ejemplos:
fuente
Parece que
this.Opacity
es un valor doble, y al compilador no le gusta que intentes meter un valor decimal en él.fuente
La propiedad Opacity es de doble tipo:
o simplemente:
o:
Tenga en cuenta que estoy usando
5000.0
(o5000d
) para forzar una división doble porquetrackBar1.Value
es un número entero y realizaría una división entera y el resultado sería un número entero.fuente
Deberías usar en
5000.0
lugar de5000
.fuente
Suponiendo que está usando WinForms,
Form.Opacity
es de tipodouble
, por lo que debe usar:A menos que necesite el valor en otro lugar, es más simple escribir:
La razón por la que el control no funciona cuando cambiaste tu código para que sea simplemente doble fue porque tenías:
que interpretó el
5000
como un entero, y debido atrackbar1.Value
que también es un entero, sutrans
valor siempre fue cero. Al hacer explícitamente el valor numérico de coma flotante al agregar el.0
compilador, ahora puede interpretarlo como un doble y realizar el cálculo adecuado.fuente
La mejor solución es:
fuente
Como
Opacity
es un valor doble, solo usaría un doble desde el principio y no lanzaría en absoluto, pero asegúrese de usar un doble al dividir para que no pierda ninguna precisiónfuente
fuente
Prueba esto:
fuente