【发布时间】:2010-05-19 20:15:56
【问题描述】:
当类型本身未知时,我正在尝试找出支持将整数类型(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 是什么)” .因为对象最终来自同一个来源,所以真的不可能有不匹配的情况(短!=长)。
我为这个人为的例子道歉,这似乎是演示语法的最佳方式。
谢谢。
【问题讨论】:
-
你们所有的
GetBoxed方法都返回LongValue。错字? -
“不能有不匹配”是什么意思?如果您知道类型,则不可能;如果你不这样做,那么可能会有。
-
您希望如何使用拆箱的结果?如果您在拆箱后不知道类型,那么您将无法对它做任何事情(除了猜测和使用
dynamic)。如果您确实知道拆箱后的类型,请拆箱到该类型。在您的示例中,您知道 newData.IntValue 只能分配一个 int,因此您必须执行newData.IntValue = (int)yourUnknownBoxedValue;。如果此操作失败,则不能将其分配给 newData.IntValue。如果它没有失败,那么你很好。所以我说的是真的:你应该想一个不做作的例子,因为这没有任何意义。 -
我已经有一段时间没有发布这个了,但我相信这个问题是一个处理 LINQ 生成的类的通用例程。我不记得具体细节,但我相信密钥被传递给装在对象内的辅助例程;如果帮助者可以简单地“知道”正在传递的内容(short、int 或 long),它可以安全地将键与同一张表中的其他键进行比较。当项目 dba 决定将某些键切换为 short 时,我不再能够使用单个辅助例程。抱歉,我记不起具体细节了。
标签: c# .net object unboxing inferred-type