Vra

Ek wil 'n spoorbalk gebruik om 'n vorm se ondeursigtigheid te verander.

Dit is my kode:

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

Wanneer ek die toepassing bou, gee dit die volgende fout:

Kan nie implisiet tipe omskakel nie 'decimal' aan 'double'.

Ek het probeer gebruik trans en double maar dan werk die beheer nie.Hierdie kode het goed gewerk in 'n vorige VB.NET-projek.

Was dit nuttig?

Oplossing

'n Eksplisiete rolverdeling om so te verdubbel is nie nodig nie:

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

Identifiseer die konstante as 5000.0 (of as 5000d) is voldoende:

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

Ander wenke

'n Meer generiese antwoord vir die generiese vraag "Desimale vs dubbel?": Desimale vir monetêre berekeninge om die akkuraatheid te behou, Dubbel vir wetenskaplike berekeninge wat nie deur klein verskille geraak word nie.Aangesien Double 'n tipe is wat inheems aan die SVE is (interne voorstelling word in basis 2), vaar berekeninge wat met Dubbel gemaak is beter as Desimale (wat voorgestel word in basis 10 intern).

Jou kode het goed gewerk in VB.NET omdat dit implisiet enige casts doen, terwyl C# beide implisiete en eksplisiete het.

In C# is die omskakeling van desimale na dubbel eksplisiet soos jy akkuraatheid verloor.1.1 kan byvoorbeeld nie akkuraat uitgedruk word as 'n dubbel nie, maar kan as 'n desimale (sien "Wisselpuntgetalle – meer onakkuraat as wat jy dink"om die rede hoekom).

In VB is die omskakeling vir jou bygevoeg deur die samesteller:

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

Daardie (double) moet uitdruklik in C# gestel word, maar kan wees geïmpliseer deur VB se meer 'vergewensgesinde' samesteller.

Hoekom deel jy deur 5000?Stel net die TrackBar se Minimum en Maksimum waardes tussen 0 en 100 en deel dan die Waarde deur 100 vir die Deursigtigheid persentasie.Die minimum 20 voorbeeld hieronder verhoed dat die vorm heeltemal onsigbaar word:

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

Jy het twee probleme.Eerstens, Opacity vereis 'n dubbele, nie 'n desimale waarde nie.Die samesteller vertel jou dat hoewel daar 'n omskakeling tussen desimale en dubbele is, dit 'n eksplisiete omskakeling is wat jy moet spesifiseer sodat dit kan werk.Die tweede is dit TrackBar.Value is 'n heelgetalwaarde en deling van 'n int deur 'n int lei tot 'n int, ongeag aan watter tipe veranderlike jy dit toeken.In hierdie geval is daar 'n implisiete cast van int tot desimale of dubbel - want daar is geen verlies aan presisie wanneer jy die cast doen nie - so die samesteller kla nie, maar die waarde wat jy kry is altyd 0, vermoedelik, aangesien trackBar.Value is altyd minder as 5000.Die oplossing is om jou kode te verander om dubbel te gebruik (die inheemse tipe vir Ondeursigtigheid) en swaaipuntrekenkunde te doen deur die konstante eksplisiet 'n dubbel te maak - wat die effek sal hê om die rekenkunde te bevorder - of casting trackBar.Value om te verdubbel, wat dieselfde ding sal doen - of albei.O, en jy het nie die intermediêre veranderlike nodig nie, tensy dit elders gebruik word.My raaiskoot is dat die samesteller dit in elk geval sal optimeer.

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

Na my mening is dit wenslik om so eksplisiet moontlik te wees.Dit voeg duidelikheid by die kode en help jou medeprogrammeerders wat dit uiteindelik kan lees.

Benewens (of in plaas van) die byvoeging van 'n .0 na die nommer, kan jy gebruik decimal.ToDouble().

Hier is 'n paar voorbeelde:

// Example 1
double transperancy = trackBar1.Value/5000;
this.Opacity = decimal.ToDouble(transperancy);

// Example 2 - with inline temp
this.Opacity = decimal.ToDouble(trackBar1.Value/5000);

Dit klink soos this.Opacity is 'n dubbele waarde, en die samesteller hou nie daarvan dat jy probeer om 'n desimale waarde daarin te prop nie.

Jy moet gebruik 5000.0 in plaas van 5000.

Die Ondeursigtigheid eiendom is van dubbel tipe:

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

of bloot:

this.Opacity = trackBar1.Value / 5000.0;

of:

this.Opacity = trackBar1.Value / 5000d;

Let op dat ek gebruik 5000.0 (of 5000d) om 'n dubbeldeling af te dwing omdat trackBar1.Value is 'n heelgetal en dit sal 'n heelgetaldeling uitvoer en die resultaat sal 'n heelgetal wees.

Gestel jy gebruik WinForms, Form.Opacity is van tipe double, so jy moet gebruik:

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

Tensy jy die waarde elders nodig het, is dit makliker om te skryf:

this.Opacity = trackBar1.Value / 5000.0;

Die rede waarom die beheer nie werk toe jy jou kode verander het om bloot 'n dubbel te wees nie, was omdat jy:

double trans = trackbar1.Value / 5000;

wat die geïnterpreteer het 5000 as 'n heelgetal, en omdat trackbar1.Value is ook 'n heelgetal jou trans waarde was altyd nul.Deur die numeriese eksplisiet 'n swaaipuntwaarde te maak deur die by te voeg .0 die samesteller kan dit nou as 'n dubbel interpreteer en die regte berekening uitvoer.

Die beste oplossing is:

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

Sedert Opacity is 'n dubbele waarde, ek sal net van die begin af 'n dubbel gebruik en glad nie gooi nie, maar maak seker dat jy 'n dubbel gebruik wanneer jy deel sodat jy nie enige presisie verloor nie

Opacity = trackBar1.Value / 5000.0;
this.Opacity = trackBar1.Value / 5000d;
Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top