拆箱未知类型
当类型本身未知时,我试图找出支持将整数类型(short/int/long)拆箱为其内在类型的语法。
这是一个完全人为的示例,演示了这个概念:
// 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
}
在每种情况下,整数类型都是一致的,因此应该有某种形式的语法来表示“该对象包含简单类型的 X,将其返回为 X(即使我不这样做)不知道 X 是什么)”。因为对象最终来自同一源,所以确实不可能不匹配(短!=长)。
我对这个人为的例子表示歉意,这似乎是演示语法的最佳方式。
谢谢。
I'm trying to figure out syntax that supports unboxing an integral type (short/int/long) to its intrinsic type, when the type itself is unknown.
Here is a completely contrived example that demonstrates the concept:
// 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
}
In each case, the integral types are consistent, so there should be some form of syntax that says "the object contains a simple type of X, return that as X (even though I don't know what X is)". Because the objects ultimately come from the same source, there really can't be a mismatch (short != long).
I apologize for the contrived example, it seemed like the best way to demonstrate the syntax.
Thanks.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
好吧,对象本身是框架所知道的最通用的类型。是装箱值类型(包括原始类型)还是其他类型并不重要;如果您想获得更具体的信息,您必须进行类型转换,除非您仍然处于“松散类型”的世界中,
object
(或者,在 C# 4 中,dynamic )。
但请注意,您可以使用一系列条件来实现您想要的效果:
编辑:通用“框”也可以实现您想要的效果:
然后可以使用它来代替
对象
;它仍然是一个对象引用,但它也是原始结构或原始类型的强类型。Well, the
object
in itself is the most generic type the framework knows. Whether is is a boxed value type (including primitive) or something else doesn't matter; if you want to get more specific you have to do a typecast unless you remain in the "loosely typed" world withobject
(or, in C# 4,dynamic
).Note, however, that you can use a list of conditions to achieve what you want:
Edit: A generic "box" may also do what you want:
This can then be used instead of
object
; it is still an object reference but it is also strongly typed to the original structure or primitive type.我不完全确定你想用这个实现什么,但你的 DataStruct 类型是错误的。
我想,并不是它的所有方法都返回 LongValue。
否则,您始终可以使用 Convert 类来尝试在不同类型之间进行转换。
例如:
如果您有不同的意思,请澄清您的帖子(只需点击编辑按钮并编辑它)。
顺便说一句,从
object
进行转换可能很容易出错,因为它是所有内容的基本类型。因此,object
可以是任何东西,这意味着您不能总是安全地将object
转换为 int 或任何其他类型。更多示例:
这也很有用:
我希望这会有所帮助。
I'm not completely sure about what you'd like to achieve with this, but your DataStruct type is errornous.
I suppose, not all of its methods return LongValue.
Otherwise, you can always use the Convert class to try to convert between different types.
For example:
Please clarify your post (just hit the edit button and edit it) if you meant something different.
By the way, converting from
object
can be quite error-prone as it is the base type of everything. So, anobject
can be anything, and that means that you can't always safely convert anobject
to an int or any other type.More examples:
And this is also useful:
I hope this helps.
您可以返回
dynamic
,然后可以将其转换为整型。You can return
dynamic
, which can then be cast to an integral type.正如其他人所述,您的示例将不起作用,因为您从每个方法返回 LongValue,因此您将在此处得到无效的强制转换异常(装箱的长整型不能转换为短整型)。
但是,使用 C# 4 的
dynamic
,这将起作用(请注意对 GetBoxed 方法和dynamic
而不是object
的修复:请注意,您不但请注意,在最后三种情况下,如果类型不对齐(如
GetBoxedShortValue() { return LongValue; }
),则最后三行将导致无效。 (有趣的是,前三个不会,它们只会工作,但是当您将dynamic
更改回object
时,它们将会抛出无效的强制转换异常。)As stated by others, your example won't work, because you return LongValue from each method, so you'll get an invalid cast exception here (a boxed long cannot be cast to short).
However, using C# 4's
dynamic
, this will work (note the fixes to your GetBoxed methods anddynamic
rather thanobject
:Note that you don't need any casts in the last three cases. Note also, however, that if the types don't align, like in
GetBoxedShortValue() { return LongValue; }
, the last three lines will result in invalid cast exceptions. (Interestingly the first three won't, they'll just work, but when you changedynamic
back intoobject
, they will throw invalid cast exceptions.)