2014-09-24 6 views

risposta

27

Come sempre, le specifiche C# è il miglior posto dove andare per questo genere di cose.

Dalla sezione 7.13 del C# 5 specification (sottolineatura mia):

Un nullo coalescenza espressione della forma a ?? b richiede a essere di un tipo nullable o tipo di riferimento. Se a non è nullo, il risultato di a ?? b è a; in caso contrario, il risultato è b. L'operazione valuta b solo se a è nullo.

Ci sono più dettagli su quando vengono eseguite le conversioni e il comportamento esatto, ma questo è il punto principale della domanda. Vale anche la pena notare che l'operatore con coalizione nulla ha ragione-associativa, quindi a ?? b ?? c viene valutato come a ?? (b ?? c) ... il che significa che valuterà solo c se siaa e sono nulli.

+0

Grazie di non aver mai pensato di controllare la specifica –

+9

@AntarrByrd: * Sempre * controllare le specifiche :) La specifica C# è una delle scritte migliori Ho visto, ed è la fonte autorevole di questo genere di cose. –

+0

L'associatività di questo operatore ha effettivamente qualche effetto osservabile sul suo comportamento? Sto provando a pensare a un caso in cui '(a ?? b) ?? c' si comporterebbe diversamente da 'a ?? (b ?? c) ', e non riesco a pensare a uno. – JLRishe

11

Perché non provarlo :)

void Main() 
{ 
    var leftOrRight = left ?? right; 
} 

public bool? left 
{ 
    get 
    { 
     Console.WriteLine ("Left hit"); 
     return true; 
    } 
} 

public bool right 
{ 
    get 
    { 
     Console.WriteLine ("Right hit"); 
     return true; 
    } 
} 

E la risposta alla domanda è no ... Il secondo valore non viene valutata

2

check this out. Se il nome non è nullo, la console mostra "MyName". Se si tratta di nulla, spettacoli console "chiamato" poi "Allo"

using System;   
public class Program 
{ 
    public static void Main() 
    { 
     string name = "MyName"; 

     Console.WriteLine(name??test()); 
    } 

    private static string test() 
    { 
     Console.WriteLine("Called"); 
     return "Allo"; 
    } 
} 
4

Dalla specifica:

un null coalescenza espressione della forma a ?? b richiede che sia un tipo o un tipo di riferimento nullable. Se a è non nullo, il risultato di un ?? b è un; altrimenti, il risultato è b. L'operazione valuta b solo se a è nullo.

(enfasi aggiunta)