我有一个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取消装箱作为小数.
有谁知道为什么会这样?有什么微妙的我不见了吗?
请帮助我们解决"几乎"的争议一切都是一个对象(Stack Overflow问题的答案作为一个新手,在学习C#之前有什么我应该注意的吗?).我认为就是这种情况,因为Visual Studio中的所有内容至少都显示为结构体.请张贴参考文献,以免它变成"现代傻瓜"(This American Life).
请注意,这个问题涉及C#,不一定是.NET,以及它如何处理引擎盖下的数据(显然它都是1和0).
以下是"一切都是对象"的评论:
对象的定义:"对象"作为类System.Object的继承者与"对象"作为类型与"对象"作为引用类型的实例."
我如何可以比较System.Enum一个enum没有拳击?例如,如何在不装箱的情况下使下面的代码工作enum?
enum Color
{
Red,
Green,
Blue
}
...
System.Enum myEnum = GetEnum(); // Returns a System.Enum.
// May be a Color, may be some other enum type.
...
if (myEnum == Color.Red) // ERROR!
{
DoSomething();
}
Run Code Online (Sandbox Code Playgroud)
具体而言,此处的目的不是比较基础值.在这种情况下,基础值并不重要.相反,如果两个枚举具有相同的基础值,则如果它们是两种不同的枚举,则不应将它们视为相等:
enum Fruit
{
Apple = 0,
Banana = 1,
Orange = 2
}
enum Vegetable
{
Tomato = 0,
Carrot = 1,
Celery = 2
}
myEnum = Vegetable.Tomato;
if (myEnum != Fruit.Apple) // ERROR! …Run Code Online (Sandbox Code Playgroud) 我很想知道C#中的所有演员阵容是否会导致拳击,如果不是,所有演员阵容都是昂贵的操作?
int i = 123;
// The following line boxes i.
object o = i;
Run Code Online (Sandbox Code Playgroud)
这一行显然导致装箱(将int类型包装为一个对象).这是一项被认为是昂贵的操作,因为它会产生将要收集的垃圾.
那些来自2种不同类型的参考类型的演员表怎么样?那是多少钱?可以正确测量吗?(与前一个例子相比)
例如:
public class A
{
}
public class B : A
{
}
var obj = new B();
var obj2 = (A)obj; // is this an "expensive" operation? this is not boxing
Run Code Online (Sandbox Code Playgroud) 我们如何在.NET中为一个对象分配一个整数?
引用类型派生自System.Object,值类型来自System.ValueType.
那么,怎么可能呢?
可能重复:
C#"as"施放vs经典施法
我想知道当我做类似的事情时,.Net CLR的内幕会发生什么
object myObj = "abc"; string myStr = (string)myObj;
以及第二行与string myStr = myObj.ToString()或如何不同string myStr = myObj as string;
环顾四周我找到了泛型的答案,比如"编译器在那里插入代码",但我并不满意......我正在寻找演员机制的深刻内容......哦,编译器插入代码?给我看看!编译器优化代码?怎么样?什么时候?
请尽可能接近金属!
我真的不熟悉铸造.因此,您可以随意编辑或评论我的问题的更改.
假设我有一个实现接口的类:
public class Class1: Interface1
{
}
Run Code Online (Sandbox Code Playgroud)
这两者之间的区别是什么?:
Interface1 myObject = new Class1();
Run Code Online (Sandbox Code Playgroud)
和
Class1 myClassObject = new Class1();
Interface1 myObject = (Interface1) myClassObject;
Run Code Online (Sandbox Code Playgroud)
第一个也是铸造的一种形式吗?
编辑:
每个人做什么?