2011-10-21 12 views
5

Quando si esegue l'overload di un operatore, come ad esempio operator +, il CIL compilato simile a questa:Perché utilizzare il nome "op_Addition" per l'operatore "+" anziché il nome "+"?

.method public hidebysig specialname static bool op_Addition(...) { ... } 

Perché utilizzare il nome op_Addition qui e non, per esempio, il nome +?

sto suggerendo che la sintassi CIL avrebbe dovuto essere

.method public hidebysig specialname static bool +(...) { ... } 

E il nome del membro, quando alla ricerca di esso, sarebbe stato + piuttosto che op_Addition.

Nota: questa è una domanda sulla progettazione della lingua; "perché le specifiche dicono così" non è una risposta utile.

+1

"perché la specifica dice ... nvm Direi che op_Addition è più semplice da analizzare poi + – Joe

+6

Forse potresti spiegare perché suggerisci che si chiami' + ', semplicemente dicendo" dovrebbe essere stato '+ "è inutile come me dicendo" perché la specifica lo dice " – BoltClock

+1

@BoltClock: perché l'operatore è' + ', non' op_Addition'. È più naturale chiamarlo '+'. Sicuramente, i progettisti avevano ragioni per Mi chiedo solo quali potrebbero essere state queste ragioni: – configurator

risposta

13

Se si denominava il metodo +, solo le lingue che supportano l'overloading dell'operatore o che consentivano + come identificativo, potevano chiamare il metodo sottostante.

standard Unicode defines a syntax for identifiers nei linguaggi di programmazione (vedi allegato 7), che viene adottato dal CLS per le regole identificatori, non include + in quella sintassi. Poiché la maggior parte delle lingue con supporto per gli identificatori Unicode aderirà a tale sintassi, è irragionevole aspettarsi che tali linguaggi consentano l'identificazione di +.

+0

Questo è esattamente quello che mi mancava - grazie. – configurator

1

Il CLR non conosce gli operatori, quindi il compilatore C# genera metodi con questi nomi speciali in modo che altri linguaggi .net che non dispongono di supporto per gli operatori possano utilizzarli come metodi.

CLR Via c# è un buon riferimento per questo tipo di domanda.

Problemi correlati