Je veux utiliser a Track-Bar
pour changer Form
l'opacité de a.
Voici mon code:
decimal trans = trackBar1.Value / 5000;
this.Opacity = trans;
Lorsque je crée l'application, cela donne l'erreur suivante:
Impossible de convertir implicitement le type
decimal
endouble
J'ai essayé d'utiliser trans
et double
puis Control
ça ne marche pas. Ce code a bien fonctionné dans un ancien projet VB.NET.
c#
floating-point
type-conversion
double
decimal
Oeufs McLaren
la source
la source
Réponses:
Un cast explicite pour
double
aimer cela n'est pas nécessaire:Identifier la constante comme
5000.0
(ou comme5000d
) suffit:la source
Une réponse plus générique à la question générique "Décimal vs Double?": Décimal pour les calculs monétaires afin de préserver la précision, Double pour les calculs scientifiques qui ne sont pas affectés par de petites différences. Étant donné que Double est un type natif du CPU (la représentation interne est stockée dans la base 2 ), les calculs effectués avec Double fonctionnent mieux que Decimal (qui est représenté en base 10 en interne).
la source
Votre code a bien fonctionné dans VB.NET car il effectue implicitement toutes les conversions, tandis que C # en a à la fois implicites et explicites.
En C #, la conversion de décimal en double est explicite car vous perdez en précision. Par exemple, 1.1 ne peut pas être exprimé avec précision sous la forme d'un double, mais peut être décimal (voir « Numéros à virgule flottante - plus imprécis que vous ne le pensez » pour la raison).
Dans VB, la conversion a été ajoutée pour vous par le compilateur:
Cela
(double)
doit être explicitement indiqué en C #, mais peut être implicite par le compilateur plus «indulgent» de VB.la source
Pourquoi divisez-vous par 5000? Définissez simplement les valeurs minimum et maximum du TrackBar entre 0 et 100, puis divisez la valeur par 100 pour le pourcentage d'opacité. L'exemple minimum 20 ci-dessous empêche le formulaire de devenir complètement invisible:
la source
5000
, OP aurait un problème avec100
?Vous avez deux problèmes. Tout d'abord,
Opacity
nécessite une valeur double et non décimale. Le compilateur vous dit que bien qu'il y ait une conversion entre décimal et double, c'est une conversion explicite que vous devez spécifier pour que cela fonctionne. La seconde est qu'ilTrackBar.Value
s'agit d'une valeur entière et la division d'un int par un int entraîne un int quel que soit le type de variable auquel vous l'assignez. Dans ce cas, il y a une conversion implicite de int en décimal ou double - car il n'y a aucune perte de précision lorsque vous effectuez la conversion - donc le compilateur ne se plaint pas, mais la valeur que vous obtenez est toujours 0, probablement, cartrackBar.Value
est toujours inférieur à 5000. La solution est de changer votre code pour utiliser le double (le type natif pour l'opacité) et faire de l'arithmétique à virgule flottante en faisant explicitement de la constante un double - ce qui aura pour effet de promouvoir l'arithmétique - ou de transtypertrackBar.Value
en double , qui fera la même chose - ou les deux. Oh, et vous n'avez pas besoin de la variable intermédiaire à moins qu'elle ne soit utilisée ailleurs. Je suppose que le compilateur l'optimiserait de toute façon.la source
À mon avis, il est souhaitable d'être aussi explicite que possible. Cela ajoute de la clarté au code et aide vos collègues programmeurs qui pourraient éventuellement le lire.
En plus (ou au lieu de) d'ajouter un
.0
au numéro, vous pouvez utiliserdecimal.ToDouble()
.Voici quelques exemples:
la source
Cela ressemble à
this.Opacity
une double valeur, et le compilateur n'aime pas que vous essayiez d'y insérer une valeur décimale.la source
La propriété Opacity est de type double:
ou simplement:
ou:
Notez que j'utilise
5000.0
(ou5000d
) pour forcer une double division cartrackBar1.Value
est un entier et il effectuerait une division entière et le résultat serait un entier.la source
Vous devez utiliser à la
5000.0
place de5000
.la source
En supposant que vous utilisez WinForms,
Form.Opacity
est de typedouble
, vous devez donc utiliser:Sauf si vous avez besoin de la valeur ailleurs, il est plus simple d'écrire:
La raison pour laquelle le contrôle ne fonctionne pas lorsque vous avez modifié votre code pour qu'il soit simplement un double est dû au fait que vous aviez:
qui a interprété le
5000
comme un entier, et parce quetrackbar1.Value
c'est aussi un entier, votretrans
valeur était toujours nulle. En faisant explicitement du numérique une valeur à virgule flottante en ajoutant le.0
compilateur, il peut désormais l'interpréter comme un double et effectuer le calcul approprié.la source
La meilleure solution est:
la source
Puisqu'il
Opacity
s'agit d'une valeur double, j'utiliserais simplement un double dès le départ et pas du tout, mais assurez-vous d'utiliser un double lors de la division afin de ne perdre aucune précisionla source
la source
Essaye ça:
la source