我正在尝试收集C#中发生装箱的所有情况:
将值类型转换为System.Object类型:
struct S { }
object box = new S();
Run Code Online (Sandbox Code Playgroud)将值类型转换为System.ValueType类型:
struct S { }
System.ValueType box = new S();
Run Code Online (Sandbox Code Playgroud)将枚举类型的值转换为System.Enum类型:
enum E { A }
System.Enum box = E.A;
Run Code Online (Sandbox Code Playgroud)将值类型转换为接口引用:
interface I { }
struct S : I { }
I box = new S();
Run Code Online (Sandbox Code Playgroud)在C#字符串连接中使用值类型:
char c = F();
string s1 = "char value will box" + c;
Run Code Online (Sandbox Code Playgroud)
注意:char类型的常量在编译时连接在一起
注意:由于6.0版的C#编译器优化串联涉及bool,char,IntPtr, …
我有一个IDataRecord reader我正在检索小数,如下所示:
decimal d = (decimal)reader[0];
Run Code Online (Sandbox Code Playgroud)
由于某种原因,这会抛出一个无效的强制转换异常,说"指定的强制转换无效".
当我这样做reader[0].GetType()时告诉我它是Int32.据我所知,这应该不是问题....
我已经通过这个片段测试了这个,它运行得很好.
int i = 3750;
decimal d = (decimal)i;
Run Code Online (Sandbox Code Playgroud)
这让我头疼不已,想知道为什么它没有将读取器中包含的int取消装箱作为小数.
有谁知道为什么会这样?有什么微妙的我不见了吗?
可能重复:
结构,接口和拳击
来自MSDN:http://msdn.microsoft.com/en-us/library/yz2be5wk.aspx
Boxing是将值类型转换为类型对象或由此值类型实现的任何接口类型的过程.
但是通用接口呢?
例如,int派生自IComparable和IComparable<int>.
假设我有以下代码:
void foo(IComparable value) { /* etc. */ }
void bar(IComparable<T> value) { /* etc. */ }
void gizmo()
{
int i = 42;
bar(i); // is `i` boxed? I'd say YES
foo(i); // is `i` boxed? I fear it is (but I hope for NO)
}
Run Code Online (Sandbox Code Playgroud)
是bar(或任何采用非通用接口的功能)意味着会有拳击吗?
是foo(或任何函数采用类型的通用接口)意味着将有拳击?
谢谢.
我有一个IEntity接口
public interface IEntity{
bool Validate();
}
Run Code Online (Sandbox Code Playgroud)
我有一个实现此接口的类Employee
public class Employee : IEntity{
public bool Validate(){ return true; }
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我有以下代码
Employee emp1 = new Employee();
IEntity ent1 = (IEntity)emp1; // Is this a boxing conversion?
Run Code Online (Sandbox Code Playgroud)
如果它不是拳击转换那么演员是如何工作的?
为什么接口引用类型?据我所知,接口是类(或结构)之间的契约,那为什么它是一个类型呢?我原以为它既不是值类型也不是引用类型.