In molti contesti in cui un argomento di metodo o operatore non è del tipo richiesto, il compilatore C # tenterà di eseguire una conversione di tipo implicita. Se il compilatore può fare in modo che tutti gli argomenti soddisfino i loro operatori e metodi aggiungendo conversioni implicite, lo farà senza lamentarsi, anche se in alcuni casi (specialmente con test di uguaglianza!) I risultati potrebbero essere sorprendenti.
Inoltre, ogni tipo di valore come into shorteffettivamente descrive sia un tipo di valore che un tipo di oggetto (*). Esistono conversioni implicite per convertire i valori in altri tipi di valori e convertire qualsiasi tipo di valore nel tipo di oggetto corrispondente, ma i diversi tipi di oggetti non sono implicitamente convertibili tra loro.
Se si utilizza l' ==operatore per confrontare a shorte an int, il valore shortverrà convertito implicitamente in un int. Se il suo valore numerico era uguale a quello di int, il inta cui è stato convertito sarà uguale inta cui viene confrontato. Se si tenta di utilizzare il Equalsmetodo in breve per confrontarlo con una int, tuttavia, l'unica conversione implicita che soddisferebbe un sovraccarico del Equalsmetodo sarebbe la conversione al tipo di oggetto corrispondente int. Quando shortviene chiesto se corrisponde all'oggetto passato, osserverà che l'oggetto in questione è intpiuttosto che a shorte quindi conclude che non può essere uguale.
In generale, sebbene il compilatore non se ne lamenti, si dovrebbe evitare di confrontare cose che non sono dello stesso tipo; se uno è interessato al fatto che la conversione di cose in una forma comune darebbe lo stesso risultato, si dovrebbe eseguire esplicitamente tale conversione. Considera, ad esempio,
int i = 16777217;
float f = 16777216.0f;
Console.WriteLine("{0}", i==f);
Ci sono tre modi in cui si potrebbe voler confrontare un inta float. Uno potrebbe voler sapere:
- Il
floatvalore più vicino possibile alla intcorrispondenza è float?
- Il numero intero parte della
floatpartita è il int?
- Esegui
inte floatrappresentano lo stesso valore numerico.
Se si tenta di confrontare un inte floatdirettamente, il codice compilato risponderà alla prima domanda; se è quello che intendeva il programmatore, tuttavia, sarà tutt'altro che ovvio. Modificando il confronto in (float)i == fmodo da chiarire che era previsto il primo significato, o (double)i == (double)ffarebbe sì che il codice rispondesse alla terza domanda (e chiarire che era quello che era previsto).
(*) Anche se le specifiche C # considerano un valore di tipo System.Int32come ad esempio un oggetto di tipo System.Int32, tale vista è contraddetta dal requisito che un codice venga eseguito su una piattaforma le cui specifiche considerano valori e oggetti come abitanti di universi diversi. Inoltre, se Tè un tipo di riferimento ed xè un T, allora Tdovrebbe essere possibile fare riferimento a un riferimento di tipo x. Pertanto, se una variabile vdi tipo Int32contiene un Object, un riferimento di tipo Objectdovrebbe essere in grado di contenere un riferimento vo il suo contenuto. In effetti, un riferimento di tipo Objectsarebbe in grado di indicare un oggetto contenente dati copiati v, ma non a vse stesso né al suo contenuto. Ciò suggerirebbe che nessuno dei duevné il suo contenuto è davvero un Object.