2010-07-30 16 views
49

Stavo guardando this article e sto lottando per seguire l'esempio VB.NET che spiega gli operatori sollevati. Non sembra esserci un esempio o un'esercitazione C# equivalente. Non ho molta esperienza con l'overloading dell'operatore in generale, quindi tentare di venire a patti con l'equivalente VB.NET durante la lettura su tipi nullable probabilmente non è il miglior punto di partenza ...Cosa sono gli operatori sollevati?

Qualcuno dovrebbe essere in grado di fornire una spiegazione degli operatori sollevati e di come vengono utilizzati dai tipi nullable? Significa solo che il tipo annullabile non sovraccarica di per sé gli operatori e utilizzerà gli operatori dal tipo sottostante che rappresenta?

Non sembrano esserci molte informazioni su SO degli operatori sollevati, quindi speriamo che questo possa aiutare anche altri.

Grazie

+0

Ah .. Pensavo che (null >> 1) non era valido e mi chiedevo perché è il caso che ?? sembra operare su x nella seconda istruzione di (int? x = null; (x >> 1) ?? -1;). Pensavo che ?? "lo trasforma" in una forma valida ((x == null)? -1: (x >> 1);). Si scopre che stava operando su (x >> 1), invece, e che (null >> 1) è valido. – blizpasta

risposta

92

operatori Lifted sono operatori che lavorano su tipi nullable da "sollevamento" gli operatori già presenti sul modulo non annullabile. Quindi, per esempio, se lo fai:

int? x = 10; 
int? y = 10; 
int? z = x + y; 

Quel "+" operatore è sollevato. In realtà non esiste su Nullable<int> ma il compilatore C# funziona come se lo fosse, generando codice per fare la cosa giusta. (Per la maggior parte dei casi, si tratta di verificare se uno degli operandi è nullo, in caso affermativo, il risultato è nullo. Altrimenti, scartare entrambi gli operandi ai valori non annullabili, utilizzare l'operatore normale e quindi racchiudere il risultato in un Tuttavia, ci sono alcuni casi particolari intorno ai confronti).

Vedere la sezione 6.4.2 (operatori di conversione sollevata) e 7.3.7 (operatori sollevati) di C# spec per ulteriori informazioni.

+3

Questa risposta non dice nulla su cosa sia effettivamente "la cosa giusta", che io ritengo sia l'aspetto più importante di come funzionano gli operatori sollevati. – Ani

+0

@JonSkeet: il tuo link indirizza alla specifica C# 5; intendevi dire 5 qui o collegarti alle 4 specifiche? –

+0

@ Cᴏʀʏ: Era la specifica C# 4 quando mi collegavo ad esso, ma quel collegamento ora va alla specifica C# 5 ... potrebbe essere la specifica C# 6 in pochi mesi :) –

Problemi correlati