我有一个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取消装箱作为小数.
有谁知道为什么会这样?有什么微妙的我不见了吗?
为什么这个显式转换会抛出Specified cast is not valid.异常?
decimal d = 10m;
object o = d;
int x = (int)o;
Run Code Online (Sandbox Code Playgroud)
但这有效:
int x = (int)(decimal)o;
Run Code Online (Sandbox Code Playgroud) 我有这个方法:
private static Dossier PrepareDossier(List<List<object>> rawDossier)
{
return new Dossier((int)rawDossier[0][0]);
}
Run Code Online (Sandbox Code Playgroud)
当我使用它时,我得到了一个InvalidCastException.但是,当我使用Convert.ToInt32(rawDossier[0][0])它时工作得很好.问题是什么?
在判断此问题已得到回答之前,请阅读说明。我在下面有这个简单的代码:
Dictionary<string, object> d = new Dictionary<string, object>();
d.Add("key" , 30d);
System.Diagnostics.Debug.WriteLine($" TYPE OF OBJECT IS \"{d["key"].GetType()}\"");
netPlannedHours = (float)d["key"]; ---> **Line of Interest**
Run Code Online (Sandbox Code Playgroud)
当我执行这个我得到:
对象的类型为“ System.Double”。引发异常:DevOpsAutomatedReporting.dll中的“ System.InvalidCastException”无法将类型为“ System.Double”的对象转换为类型为“ System.Single”。
例外是由标记为“兴趣线”的最后一行引起的。我真的不明白为什么最后一行会导致这种情况,因为在运行时将对象的类型推断为“ System.Double”,因此它应该将其强制转换为浮点数,但事实并非如此。有趣的一点是,如果我用以下两行代码之一替换最后一行(“感兴趣的行”),它将成功将double转换为float
// Cast the double object to double again and then to float **WORKS**
netPlannedHours = (float)(double)d["key"];
// Convert to float using "Convert.ToSingle()" **WORKS**
netPlannedHours = Convert.ToSingle(d["key"]);
Run Code Online (Sandbox Code Playgroud)
请对此有所启发。谢谢!