[C#]Stranezze su un errore di compilazione dovuto al cast di numeri

venerdì 03 luglio 2009 - 12.00

phai Profilo | Newbie

Ciao a tutti... rieccomi qui con una domanda.
Non si tratta di una richiesta di aiuto, in quanto ho risolto, ma di un semplice chiedervi: "secondo voi perché?".

Vi incollo due righe di codice in cui utilizzo una List di Byte e devo restituire il numero dei suoi elementi qualora ne abbia più di uno, altrimenti restituisco 0:
public Byte funzione() { List<Byte> returnValue = new List<Byte>(); ... return ((returnValue.Count == 1)?returnValue.First():0); }

L'errore di compilazione è:
Impossibile convertire in modo implicito il tipo 'int' in 'byte'. È presente una conversione esplicita. Probabile cast mancante.

Quindi penso: ok, l'errore può essere:
1. l'uguaglianza tra Byte e Int32 non funziona (ma non dovrebbe essere un problema visto che da Byte a Int32 avviene un cast implicito);
2. returnValue.First() non è di tipo Byte (ma anche qui non è possibile, visto che stiamo parlando di una lista generica);
3. il valore "0" non è considerato di tipo Byte in quanto da Int32 a Byte il cast non può avvenire implicitamente.

In effetti la riga seguente risolve il problema (notare il cast dello 0):
return ((returnValue.Count == 1)?returnValue.First():(Byte)0);

Ok... a questo punto penso... ok: ha senso... però poi faccio una prova ulteriore sostituendo quella forma contratta di if nella seguente:
if (returnValue.Count == 1) { return returnValue.First(); } return 0;

E... sorpresa sorpresa... quel return 0 non da errori... quindi ha considerato lo 0 come Byte o ha eseguito un cast implicito... non lo so...

Fatto sta che mi domando: ma perché in un caso la cosa va bene (return 0) e nell'altro no ( (-)?-:0 )?

Avete delle idee in merito?

Grazie

alx_81 Profilo | Guru

>Ciao a tutti...
Ciao!

>E... sorpresa sorpresa... quel return 0 non da errori... quindi
>ha considerato lo 0 come Byte o ha eseguito un cast implicito...
>non lo so...
>Fatto sta che mi domando: ma perché in un caso la cosa va bene
>(return 0) e nell'altro no ( (-)?-:0 )?
perchè nel secondo, tutti gli operandi DEVONO essere dello stesso tipo. Poi il compilatore casta il tipo di ritorno solo dopo aver valutato l'espressione.

>Grazie
di nulla!
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

phai Profilo | Newbie

:)
Grazie ancora... ;)
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5