tornare alle basi ...Come si può verificare le conversioni "sicure" tra i tipi di valore in .NET?
Per i tipi di riferimento, si può fare questo:
SomeType someObject = firstObject as SomeType;
if (someObject == null)
{
// Handle the situation gracefully
}
else
{
// Do stuff
}
Per i tipi di valore, la mia comprensione è che abbiamo le conversioni implicite (senza perdita di dati), le conversioni esplicite (necessario se c'è il rischio di perdita di dati), la classe Convert
(un "wrapper di conversione" penso) e anche le conversioni specifiche del tipo (ad esempio double x = Double.Parse("2");
), ma non ho trovato nulla di simile all'operatore as
sopra.
Quindi, la mia domanda è: fa il quadro fornisce con qualche metodo/operatore/tecnica per fare qualcosa in questo senso:
if (!Convert.CanConvert(someValue, someValueType))
{
// Beware! Data loss can occur
}
else
{
// No data loss here
}
In caso contrario, qualcuno là fuori può suggerire un approccio solido per costruire una di queste Metodo CanConvert
?
Grazie mille!
EDIT (1): l'utente-caso/problema è il seguente: Dato un qualcosa approvata dal consumatore del codice (il mio altro sé, ma questo è irrilevante), (1) Verificare che qualcosa è un numero (abbastanza semplice) e (2) Posizionare qualcosa di nel tipo numerico "più piccolo" dove si adatta senza incorrere in perdita di dati.
Alcuni background: la natura di ciò che sto cercando di fare è più matematica che tecnica: sto cercando di vedere se/come posso adattare i tipi numerici esistenti in una sorta di gerarchia algebrica del modulo Monoid = > Gruppo => Anello => Campo (o una sua versione semplificata). Mentre si lavora su questo, e non molto sicuro di come, "una cosa tira l'altra" e mi sono trovato a dover fare i conti con le conversioni di tipo ...
Ri: la tua modifica - Realmente faccio qualcosa del genere come parte di un algoritmo di compressione in linea. Il mio metodo? Inizia con un 'long', confrontalo con' byte.MaxValue', quindi 'short.MaxValue', e poi' int.MaxValue', e gettalo nel più piccolo che si adatta! – Aaronaught
Sto provando qualcosa di molto simile a questo seguendo il suggerimento di Rob sotto. Stessa idea: prova le conversioni seguendo un ordine predefinito (considero tutto ciò che non è firmato "più piccolo" di qualsiasi cosa firmata per ragioni matematiche, anche se la memoria non è vera). BTW: hai qualche web/blog in cui posso controllare il tuo algoritmo? –