Non posso dire circa i motivi reali, ma vedo tre possibili ragioni:
1) Nullable types sono state introdotte in .NET 2.0, mentre il first TryParse
methods erano già in giro dal .NET 1.1.Pertanto, quando sono stati introdotti i tipi nullable, era troppo tardi per una tale modifica dell'API; e le nuove classi non implementerebbero TryParse
in modo diverso perché il modello era già stato impostato.
2) Non tutti i tipi possono essere utilizzati con Nullable
structure, solo i tipi di valori possono. Tuttavia, esistono metodi che seguono lo schema Try*
che devono restituire tipi di riferimento. Ad esempio, un dizionario può legittimamente contenere null
come un elemento, quindi il suo TryGetValue
method richiede un ulteriore modo per esprimere che una chiave non è stata trovata.
3) Il modo in cui i Try*
-metodi sono scritte, è possibile scrivere codice come questo:
int myValue;
if (int.TryParse("42", out myValue)) {
// do something with myValue
}
// do something else
}
Ora, immaginate se TryParse
restituito solo un int?
. È possibile disporre della variabile myValue
e perdere il risultato:
if (int.TryParse("42").HasValue) {
// do something with ... what? You didn't store the conversion result!
}
// do something else
}
Oppure è possibile aggiungere una variabile annullabile:
int? myValue = int.TryParse("42");
if (myValue.HasValue) {
// do something with myValue.Value
}
// do something else
}
Questo non è un vantaggio rispetto alla versione attuale più, e invece richiede la scrittura di myValue.Value
in alcune istanze successive, dove altrimenti sarebbe sufficiente un semplice value
. Si noti che in molti casi, è sufficiente che solo richieda l'informazione sull'esito dell'operazione per l'istruzione if
.
Questa sarebbe una domanda per il team di sviluppo di .NET Framework. La maggior parte dei negozi finisce per scrivere un metodo di estensione 'stringa' chiamato qualcosa sulla falsariga di' ToNullableInt' che implementa il comportamento che si desidera. Non sarei sorpreso se una versione futura di C# supporti questo in modo nativo. –
Forse perché le altre lingue non hanno una sintassi così semplice per Nullables. Per esempio. in C++/CLI devi scrivere 'Nullable result = int :: TryParse (...)'. –
Stephan
Che motivo avete per trattare qualsiasi stringa casuale come 'null'? La maggior parte degli usi potenziali che ho visto di una conversione da 'stringa' a' int? 'Sono per convertire una stringa vuota in' null', per convertire una stringa non vuota in un 'int' valido e per rifiutare la spazzatura casuale come' @ ($^V @ Q (% ^% (@ B^N ('. Questo non sarebbe adatto per' int.TryParse', indipendentemente dal tipo di ritorno.Puoi dare uno scenario ragionevole in cui 'TryParse 'restituire' T? 'è effettivamente desiderabile? – hvd