Tôi đang cố gắng tìm ra cú pháp hỗ trợ unboxing một loại tích phân (ngắn/int/long) thành kiểu nội tại của nó, khi chính loại đó chưa được biết.Unboxing to unknown type
Dưới đây là một ví dụ hoàn toàn giả tạo đó chứng tỏ các khái niệm:
// 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
}
Trong mỗi trường hợp, các loại không thể thiếu phù hợp, vì vậy cần có một số hình thức cú pháp nói rằng "đối tượng chứa một loại đơn giản X, trả về X (mặc dù tôi không biết X là gì) ". Bởi vì các đối tượng cuối cùng đến từ cùng một nguồn, có thực sự không thể là một không phù hợp (ngắn! = Dài).
Tôi xin lỗi vì ví dụ giả tạo này, có vẻ như cách tốt nhất để chứng minh cú pháp.
Cảm ơn.
Tất cả các phương thức 'GetBoxed' đều trả về' LongValue'. Typo? – unholysampler
Ý bạn là "không thể không khớp"? Nếu bạn biết loại, thì không thể có; nếu không, thì có thể. –
Bạn muốn sử dụng kết quả unboxing của mình như thế nào? Nếu bạn không biết loại sau khi unboxing, sau đó bạn không thể làm bất cứ điều gì với nó (ngoài việc đoán và sử dụng 'năng động'). Nếu bạn biết loại sau khi unboxing, sau đó unbox để loại đó. Trong ví dụ của bạn, bạn biết rằng newData.IntValue chỉ có thể được gán với một int, do đó bạn _have_ để làm 'newData.IntValue = (int) yourUnknownBoxedValue;'. Nếu điều này sau đó không thành công, bạn không thể gán nó cho newData.IntValue. Nếu nó không thất bại, thì bạn ổn. Vì vậy, những gì tôi đang nói là thực sự: bạn nên nghĩ ra một ví dụ không phải là giả tạo, bởi vì điều này không có ý nghĩa. – Joren