Saya ingin menggunakan a Track-Bar
untuk mengubah Form
opacity.
Ini kode saya:
decimal trans = trackBar1.Value / 5000;
this.Opacity = trans;
Ketika saya membangun aplikasi, itu memberikan kesalahan berikut:
Tidak dapat secara implisit mengkonversi tipe
decimal
menjadidouble
Saya sudah mencoba menggunakan trans
dan double
kemudian Control
tidak berhasil. Kode ini berfungsi dengan baik di proyek VB.NET sebelumnya.
c#
floating-point
type-conversion
double
decimal
Eggs McLaren
sumber
sumber
Jawaban:
Pemain eksplisit untuk
double
menyukai ini tidak perlu:Mengidentifikasi konstanta sebagai
5000.0
(atau sebagai5000d
) sudah cukup:sumber
Jawaban yang lebih umum untuk pertanyaan umum "Desimal vs Double?": Desimal untuk perhitungan moneter untuk menjaga presisi, Double untuk perhitungan ilmiah yang tidak terpengaruh oleh perbedaan kecil. Karena Double adalah tipe yang asli dari CPU (representasi internal disimpan di basis 2 ), perhitungan yang dibuat dengan Double berkinerja lebih baik daripada Desimal (yang direpresentasikan dalam basis 10 secara internal).
sumber
Kode Anda berfungsi dengan baik di VB.NET karena secara implisit melakukan gips, sementara C # memiliki yang implisit dan eksplisit.
Dalam C # konversi dari desimal ke ganda eksplisit karena Anda kehilangan keakuratan. Misalnya 1.1 tidak dapat secara akurat dinyatakan sebagai dobel, tetapi dapat sebagai desimal (lihat " Angka titik mengambang - lebih tidak akurat daripada yang Anda pikirkan " karena alasan mengapa).
Di VB konversi ditambahkan untuk Anda oleh kompiler:
Itu
(double)
harus secara eksplisit dinyatakan dalam C #, tetapi dapat tersirat oleh kompiler VB yang lebih 'pemaaf'.sumber
Mengapa Anda membaginya dengan 5000? Cukup atur nilai Minimum dan Maksimum TrackBar antara 0 dan 100 dan kemudian bagi Nilai dengan 100 untuk persentase Opacity. Minimal 20 contoh di bawah ini mencegah formulir menjadi sama sekali tidak terlihat:
sumber
5000
, OP akan punya masalah dengan100
?Anda memiliki dua masalah. Pertama,
Opacity
membutuhkan nilai ganda, bukan nilai desimal. Kompiler memberi tahu Anda bahwa meskipun ada konversi antara desimal dan dobel, itu adalah konversi eksplisit yang harus Anda tentukan agar dapat berfungsi. Yang kedua adalahTrackBar.Value
nilai integer dan membagi sebuah int dengan sebuah int menghasilkan sebuah int, apa pun jenis variabel yang Anda tetapkan. Dalam hal ini ada gips implisit dari int ke desimal atau dobel - karena tidak ada kehilangan presisi ketika Anda melakukan gips - sehingga kompiler tidak mengeluh, tetapi nilai yang Anda dapatkan selalu 0, mungkin, karenatrackBar.Value
selalu kurang dari 5000. Solusinya adalah mengubah kode Anda untuk menggunakan ganda (tipe asli untuk Opacity) dan melakukan aritmatika floating point dengan secara eksplisit membuat konstanta ganda - yang akan memiliki efek mempromosikan aritmatika - atau castingtrackBar.Value
untuk menggandakan , yang akan melakukan hal yang sama - atau keduanya. Oh, dan Anda tidak perlu variabel antara kecuali digunakan di tempat lain. Dugaan saya adalah kompiler akan mengoptimalkannya.sumber
Menurut pendapat saya, diinginkan untuk sejelas mungkin. Ini menambah kejelasan kode dan membantu sesama programmer yang akhirnya membacanya.
Selain (atau bukannya) menambahkan
.0
ke nomor, Anda dapat menggunakandecimal.ToDouble()
.Berikut ini beberapa contohnya:
sumber
Kedengarannya seperti
this.Opacity
nilai ganda, dan kompiler tidak suka Anda mencoba menjejalkan nilai desimal ke dalamnya.sumber
The Opacity properti adalah tipe ganda:
atau hanya:
atau:
Perhatikan bahwa saya menggunakan
5000.0
(atau5000d
) untuk memaksa pembagian ganda karenatrackBar1.Value
merupakan bilangan bulat dan akan melakukan pembagian bilangan bulat dan hasilnya akan menjadi bilangan bulat.sumber
Anda harus menggunakan
5000.0
bukan5000
.sumber
Dengan asumsi Anda menggunakan WinForms,
Form.Opacity
adalah tipedouble
, jadi Anda harus menggunakan:Kecuali Anda membutuhkan nilai di tempat lain, lebih mudah untuk menulis:
Alasan kontrol tidak berfungsi ketika Anda mengubah kode menjadi sekadar ganda adalah karena Anda memiliki:
yang diartikan
5000
sebagai bilangan bulat, dan karenatrackbar1.Value
juga bilangan bulattrans
nilai Anda selalu nol. Dengan secara eksplisit menjadikan angka sebagai nilai titik apung dengan menambahkan.0
kompiler sekarang dapat mengartikannya sebagai dobel dan melakukan perhitungan yang tepat.sumber
Solusi terbaik adalah:
sumber
Karena
Opacity
merupakan nilai ganda, saya hanya akan menggunakan ganda dari awal dan tidak dilemparkan sama sekali, tetapi pastikan untuk menggunakan ganda saat membaginya sehingga Anda tidak kehilangan presisi apa punsumber
sumber
Coba ini:
sumber
Kamu bisa menggunakan
Opacity = decimal.ToDouble(trackBar1.Value / 5000);
sumber