我已经通过C#阅读了CLR:
取消装箱实际上只是获取指针的操作 对象中包含的原始值类型(数据字段)。
这意味着如果对象中包含多个值类型,则可以使用以下语法将其取消装箱:
int a= (int) o; //assigns a to 10
char b= (char) o; // assigns b to 'b'
如何实现支持多个拆箱的对象?
答案 0 :(得分:2)
盒装值只能是单一类型的盒装形式 - 如果您致电o.GetType()
,您将会发现它是什么。
一般情况下,你只能拆箱到完全相同的类型,但有一些皱纹:
例如:
object o = 10;
FileMode mode = (FileMode) o; // Valid conversion to enum
int? n = (int?) o; // n has a value of 10
n = null;
o = n; // o's value is a null reference
n = (int?) o; // n's value is the null int? value
答案 1 :(得分:1)
你在谈论铸造吗?在.NET中,如果你有一个盒装类型,它有一个特定的类型,你只能将它转换为实际值类型为unbox:
object o=10; // o is a boxed int with value 10
var a=(int)o; // works
//var b=(byte)o; // ERROR, this is not what's contained in it
var b=(byte)(int)o; // works, you get the int out then cast it to byte
var b=Convert.ToByte(o); // also works, using IConvertible
然而,泛型的主要目的(最初至少)是因为涉及的性能成本而完全避免装箱值类型。您可以将object
的大多数实例更改为通用值并保留类型,当您使用它们时,您将立即拥有正确的值类型。
答案 2 :(得分:0)
如果您有一个自定义对象,例如int或字符串,则可以使用explicit conversion operators执行此操作。
实施例
public class CustomObject
{
int Number;
string Text;
public CustomObject(int number, string text) //constructor
{
Number = number;
Text = text;
}
public static explicit operator int(CustomObject o)
{
return o.Number;
}
public static explicit operator string(CustomObject o)
{
return o.Text;
}
}