Desidero una funzione di aiuto per la ricerca digitata per una raccolta eterogenea: deve restituire una struct o una classe, altrimenti null se l'elemento non viene trovato. Di seguito è riportato un esempio che utilizza una ricerca di raccolta banale, ma potrebbe essere una chiamata al database o qualsiasi altra cosa.Come implementare il metodo di ricerca di una raccolta generica che può restituire una struct di classe o nullable?
Esiste un modo per ottenere questo risultato con una singola firma del metodo?
public T GetClass<T>(string key) where T : class
{
object o;
if (Contents.TryGetValue(key, out o))
{
return o as T;
}
return null;
}
public T? GetStruct<T>(string key) where T : struct
{
object o;
if (Contents.TryGetValue(key, out o))
{
if (o is T)
{
return (T?) o;
}
}
return null;
}
Quello che ho già provato:
- Capisco che le restrizioni generiche non possono essere utilizzati per disambiguare sovraccarichi. Quindi non posso semplicemente dare a questi due metodi lo stesso nome.
- Il reso
(Default) T
non è un'opzione, poiché 0 è un valore int valido. - Ho provato a chiamare con il
<int ?>
come tipo, ma come discusso,Nullable<T>
non è un tipo di riferimento.
C'è un modo per indicare che ho intenzione di restituire un int in scatola?
I metà come questo - ma * permette * di chiamare come 'getClass' e restituire 0 per " trovato con valore 0 "e" non trovato "indistintamente. In effetti, potresti perdere per sbaglio il secondo '?' Nel tuo esempio di utilizzo e ottenere un bug piuttosto sottile. ('result1' dovrebbe * mai * essere nullo, ma ci si aspetterebbe che sia) –
Penso che il valore predefinito per int? è nullo – akatakritos
Ma cosa succede se il valore che si sta cercando è un int regolare: penso che il (o è int?) fallirà bc int? non è un int. – akatakritos