Operatori impliciti di conversione per i tipi di valore in C #

4

Ho trovato questo articolo del blog: Gli operatori di conversione implicita sono cattivi . L'articolo scoraggia l'uso della conversione implicita con i tipi di riferimento. L'articolo descrive i problemi causati dalle conversioni implicite dei tipi di riferimento, che si riducono al seguente

[...] main question of this post: why are implicit conversion operators bad on reference types? [...] By adding an implicit conversion operator to a reference type, you have now introduced value semantics to assignments – but only from one type to another.
[emphasis original]

La mia domanda, tuttavia, riguarda i tipi di valore. All'inizio, l'articolo ha questa affermazione:

Implicit conversion operators are incredibly important to the language, but only for value types.
[emphasis original]

L'articolo non entra nei dettagli su come utilizzare la conversione implicita con i tipi di valore. Questo è quello che mi sto chiedendo. Ecco il mio pensiero attuale:

  • L'operatore di conversione è di tipo valore e restituisce un tipo valore . Implicito - ok .
  • L'operatore di conversione è di tipo di riferimento e restituisce un tipo valore . Implicito - ok .
  • L'operatore di conversione è di tipo valore e restituisce un tipo di riferimento . (Sarebbe un po 'bizzarro, ma sarebbe sbagliato?) Implicito - non va bene .
  • L'operatore di conversione è di tipo di riferimento e restituisce un tipo di riferimento . Implicito - non corretto .

In una forma più compatta:

  • Se restituisce un tipo di valore, un operatore di conversione implicita è a posto sia per tipo di valore che per tipo di riferimento.
  • Se restituisce un tipo di riferimento, la conversione implicita non è accettabile.

È corretto? È completo?

p.s. Per la maggior parte, lavoro principalmente con C e C ++, dove ho un buon controllo su cose come const, puntatori, riferimenti. Ovviamente, questo si correrebbe il rischio di contrarre cattivi bug relativi ai puntatori.

    
posta Nick Alexeev 15.10.2014 - 20:50
fonte

2 risposte

1

La risposta breve è che gli operatori impliciti sono principalmente sulla matematica.

A parità di condizioni, le chiamate al metodo sono più facili da leggere, più facili da mantenere e più facili da ragionare, per operazioni non matematiche. Gli operatori lavorano con la matematica perché sono ben compresi; tutti sanno cos'è un'operazione di addizione e quale operatore lo rappresenta. E quando non viene utilizzato in un contesto matematico (vale a dire la concatenazione di stringhe), ha ancora perfettamente senso semanticamente.

In assenza di operazioni matematiche (ad esempio tipi di riferimento), gli operatori lavorano meglio quando fanno parte del linguaggio corretto. L'operatore Lambda Expression in C # => fa parte delle specifiche del linguaggio, è ben compreso e copre un'ampia varietà di casi d'uso. Ma non significa la stessa cosa in altre lingue , come di solito fa l'operatore + .

    
risposta data 15.10.2014 - 22:47
fonte
0

Se ti attengono a tipi di riferimento immutabili, hanno la stessa semantica del valore dei tipi di valore e le restrizioni scompaiono. Non ho mai usato operatori di conversione per tipi di riferimento mutabili, poiché li uso solo nei casi in cui la semantica del valore ha più senso.

    
risposta data 09.01.2015 - 01:10
fonte

Leggi altre domande sui tag