Próbuję znaleźć składnię, która obsługuje unboxing typu integralnego (short/int/long) do jego typu wewnętrznego, gdy sam typ jest nieznany.Unboxing to unknown type
Tutaj jest całkowicie wymyślony przykład, który pokazuje koncepcję:
// Just a simple container that returns values as objects
struct DataStruct
{
public short ShortVale;
public int IntValue;
public long LongValue;
public object GetBoxedShortValue() { return ShortVale; }
public object GetBoxedIntValue() { return IntValue; }
public object GetBoxedLongValue() { return LongValue; }
}
static void Main(string[] args)
{
DataStruct data;
// Initialize data - any value will do
data.LongValue = data.IntValue = data.ShortVale = 42;
DataStruct newData;
// This works if you know the type you are expecting!
newData.ShortVale = (short)data.GetBoxedShortValue();
newData.IntValue = (int)data.GetBoxedIntValue();
newData.LongValue = (long)data.GetBoxedLongValue();
// But what about when you don't know?
newData.ShortVale = data.GetBoxedShortValue(); // error
newData.IntValue = data.GetBoxedIntValue(); // error
newData.LongValue = data.GetBoxedLongValue(); // error
}
W każdym przypadku, integralne typy są zgodne, więc nie powinno być jakaś forma składni, które mówi, że”obiekt zawiera prosty typ X, zwróć to jako X (nawet jeśli nie wiem, co to X) ". Ponieważ obiekty ostatecznie pochodzą z tego samego źródła, tak naprawdę nie może być niezgodności (short! = Long).
Przepraszam za wymyślony przykład, wydawało się najlepszym sposobem na zademonstrowanie składni.
Dzięki.
Wszystkie metody 'GetBoxed' zwracają wartość" LongValue ". Typo? – unholysampler
Co masz na myśli "nie może być niedopasowania"? Jeśli znasz typ, to nie może być; jeśli nie, to może być. –
Jak chcesz wykorzystać wynik rozpakowania? Jeśli nie znasz typu po rozpakowaniu, nie możesz nic z nim zrobić (poza zgadywaniem i używaniem 'dynamic'). Jeśli znasz typ po rozpakowaniu, odinstaluj go do tego typu. W twoim przykładzie wiesz, że newData.IntValue może być przypisany tylko z int, więc ty masz _ do zrobienia 'newData.IntValue = (int) yourNastenBoxedValue;'. Jeśli to się nie powiedzie, nie możesz przypisać go do newData.IntValue. Jeśli to się nie uda, to nic ci nie jest. To, co mówię, jest naprawdę: powinieneś wymyślić nie wymyślony przykład, ponieważ to nie ma sensu. – Joren