Chcę użyć a, Track-Bar
aby zmienić Form
krycie a.
To jest mój kod:
decimal trans = trackBar1.Value / 5000;
this.Opacity = trans;
Podczas kompilowania aplikacji pojawia się następujący błąd:
Nie można niejawnie przekonwertować typu
decimal
nadouble
Próbowałem, używając trans
i double
ale wtedy Control
nie działa. Ten kod działał dobrze w poprzednim projekcie VB.NET.
c#
floating-point
type-conversion
double
decimal
Eggs McLaren
źródło
źródło
Odpowiedzi:
Wyraźna obsada
double
tego typu nie jest konieczna:Identyfikacja stałej jako
5000.0
(lub jako5000d
) jest wystarczająca:źródło
Bardziej ogólna odpowiedź na ogólne pytanie „Dziesiętne vs podwójne?”: Dziesiętne dla obliczeń pieniężnych w celu zachowania precyzji, Podwójne dla obliczeń naukowych, na które nie wpływają niewielkie różnice. Ponieważ Double jest typem rodzimym dla procesora (wewnętrzna reprezentacja jest przechowywana w bazie 2 ), obliczenia wykonane w Double działają lepiej niż dziesiętne (które są wewnętrznie reprezentowane w bazie 10 ).
źródło
Twój kod działał dobrze w VB.NET, ponieważ domyślnie wykonuje wszelkie rzutowania, podczas gdy C # ma zarówno ukryte, jak i jawne.
W języku C # konwersja z dziesiętnej na podwójną jest wyraźna, gdy tracisz dokładność. Na przykład 1.1 nie może być dokładnie wyrażony jako liczba podwójna, ale może być ułamkiem dziesiętnym (zobacz „ Liczby zmiennoprzecinkowe - bardziej niedokładne niż myślisz ” z tego powodu).
W VB konwersja została dodana przez kompilator:
Że
(double)
musi być wyraźnie wskazane w C #, ale może być dorozumiany przez VB bardziej „wyrozumiały” kompilator.źródło
Dlaczego dzielisz przez 5000? Wystarczy ustawić minimalną i maksymalną wartość TrackBar między 0 a 100, a następnie podzielić wartość przez 100 dla procentu Krycia. Minimalny przykład 20 poniżej zapobiega całkowicie niewidoczności formularza:
źródło
5000
OP miałby problem100
?Masz dwa problemy. Po pierwsze,
Opacity
wymaga podwójnej, a nie dziesiętnej wartości. Kompilator informuje, że chociaż istnieje konwersja między dziesiętną a podwójną, jest to wyraźna konwersja, którą należy określić, aby działała. Po drugie,TrackBar.Value
jest to liczba całkowita, a podzielenie liczby całkowitej przez liczbę całkowitą daje liczbę całkowitą bez względu na typ zmiennej, do której ją przypisujesz. W tym przypadku występuje niejawne rzutowanie z int na dziesiętne lub podwójne - ponieważ nie ma utraty precyzji podczas wykonywania rzutowania - więc kompilator nie narzeka, ale otrzymywana wartość wynosi zawsze 0, prawdopodobnie, ponieważtrackBar.Value
jest zawsze mniejsza niż 5000. Rozwiązaniem jest zmiana kodu, aby używał double (rodzimy typ dla Opacity) i wykonywał arytmetykę zmiennoprzecinkową, jawnie czyniąc stałą double - co spowoduje promowanie arytmetyki - lub rzuttrackBar.Value
na double , który zrobi to samo - lub jedno i drugie. Aha, i nie potrzebujesz zmiennej pośredniej, chyba że jest używana gdzie indziej. Domyślam się, że kompilator i tak by go zoptymalizował.źródło
Moim zdaniem pożądane jest, aby być jak najbardziej wyraźnym. To dodaje przejrzystości kodu i pomaga innym programistom, którzy mogą go w końcu przeczytać.
Oprócz (lub zamiast) dodawania a
.0
do numeru możesz użyćdecimal.ToDouble()
.Oto kilka przykładów:
źródło
Wygląda na
this.Opacity
to, że jest to podwójna wartość, a kompilator nie lubi próbować wcisnąć w nią wartości dziesiętne.źródło
Właściwość Opacity jest podwójnego typu:
lub po prostu:
lub:
Zauważ, że używam
5000.0
(lub5000d
) do wymuszenia podwójnego podziału, ponieważtrackBar1.Value
jest liczbą całkowitą i wykonałby podział liczby całkowitej, a wynikiem byłaby liczba całkowita.źródło
Powinieneś użyć
5000.0
zamiast5000
.źródło
Zakładając, że używasz WinForms,
Form.Opacity
jest typudouble
, więc powinieneś użyć:O ile nie potrzebujesz wartości w innym miejscu, łatwiej jest napisać:
Powodem, dla którego formant nie działa, gdy zmienisz kod na zwykły podwójny, było to, że:
który interpretował
5000
jako liczbę całkowitą, a ponieważtrackbar1.Value
jest także liczbą całkowitą, twojatrans
wartość zawsze wynosiła zero. Poprzez jawne uczynienie z liczby zmiennoprzecinkowej przez dodanie.0
kompilatora można teraz zinterpretować ją jako podwójną i wykonać właściwe obliczenia.źródło
Najlepszym rozwiązaniem jest:
źródło
Ponieważ
Opacity
jest to podwójna wartość, po prostu użyłbym podwójnej od samego początku i wcale nie rzucałem, ale pamiętaj, aby użyć podwójnej przy dzieleniu, abyś nie stracił żadnej precyzjiźródło
źródło
Spróbuj tego:
źródło