C'è qualche differenza tra il casting e il call .Value in oggetti NullableT?

6

Supponiamo di avere una variabile nullable.

int? myVar = null;

Se desideriamo utilizzarne il valore, ci sono almeno due opzioni:

Trasmissione esplicita

DoSomething((int)myVar);

Chiamare Nullable<T> 's .Value proprietà

DoSomething(myVar.Value);

Ho notato che quando la conversione fallisce, in entrambi i casi viene generata la stessa eccezione ( System.InvalidOperationException: Nullable object must have a value ), il che mi fa pensare che entrambi siano implementati nello stesso modo (ma non ho trovato prove per tale affermazione ).

La mia domanda è:

  • C'è qualche differenza tra queste due opzioni? (cioè, c'è qualche scenario in cui avrebbero un comportamento diverso?)
  • Per quanto riguarda lo stile, una di queste due opzioni è preferibile rispetto all'altra? Perché? Secondo quale guida di stile?

Aggiorna :

Potrebbe essere ovvio, ma se ti capita di imbatterti in questa domanda, potresti considerare che un vantaggio di .Value rispetto al cast esplicito è che impedisce di provare inavvertitamente il cast in un tipo errato.

D'altra parte, il cast esplicito potrebbe essere più facile da leggere in alcuni scenari. Ad esempio, avere var value = (int)myVar; consente una più facile identificazione del tipo di var value = myVar.Value;

    
posta Sam 04.01.2017 - 16:26
fonte

1 risposta

9

Se esci dal sorgente per Nullable<T> , vedrai che l'esplicito l'operatore cast fa questo:

public static explicit operator T(Nullable<T> value) {
    return value.Value;
}

E quella proprietà Value :

public T Value {
    get {
        if (!hasValue) {
            ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_NoValue);
        }
        return value;
    }
}

In altre parole, il cast chiama la proprietà e l'eccezione viene generata dalla proprietà. Quindi, no, non c'è differenza tra le due opzioni.

Per quanto riguarda lo stile, siamo in soggettività. Entrambi sono validi ed entrambi sono stati esplicitamente consentiti dai progettisti del tipo. Opterei per l'utilizzo dell'opzione proprietà, ma questa è una scelta puramente personale.

    
risposta data 04.01.2017 - 16:34
fonte

Leggi altre domande sui tag