为什么这个显式转换会抛出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) 也许我疯了,但我认为这是一个有效的演员:
(new int[]{1,2,3,4,5}).Cast<double>()
Run Code Online (Sandbox Code Playgroud)
为什么LinqPad会抛出一个
InvalidCastException:指定的强制转换无效.
?
这个问题涉及在通用方法中铸造枚举
鉴于枚举
public enum Crustaceans
{
Frog = 1,
Toad = 4
}
Run Code Online (Sandbox Code Playgroud)
我可以简单地创建我的枚举实例
short val = 4;
Crustaceans crusty = (Crustaceans) val;
Run Code Online (Sandbox Code Playgroud)
但是,如果
short val = 4;
object obj = (object) val;
Crustaceans crusty = (Crustaceans)obj;
Run Code Online (Sandbox Code Playgroud)
尝试执行crusty的初始化时抛出运行时异常.
任何人都可以解释为什么会这样,以及为什么做这样的事情是不合法的.
并不是说我真的想要做到这一点,但是当我试图通过泛型来实现类似的事情并且有效地发生了正在发生的事情时,我遇到了一个问题.即
public T dosomething<T>(short val) where T : new()
{
T result = (T)(object) val;
return result;
}
Run Code Online (Sandbox Code Playgroud)
那么,我试图做的是有与枚举和非枚举(不是那么关键,但将是很好),可以设置为短值,而不抛出异常,实际上初始化正确的枚举值工作的通用功能.
我正在从SQL Server表中读取一行.其中一列是tinyint类型.
我想将值转换为int或int32变量.
rdr.GetByte(j)
(byte) rdr.GetValue(j)
Run Code Online (Sandbox Code Playgroud)
......似乎是检索价值的唯一方法.但是如何将结果输入int变量?
接口变量是否具有值类型或引用类型语义?
接口按类型实现,这些类型是值类型或引用类型.显然,这两个int和string实现IComparable,并且int是一个值类型,并string为引用类型.但是这个怎么样:
IComparable x = 42;
IComparable y = "Hello, World!";
Run Code Online (Sandbox Code Playgroud)
(我试图回答的问题可能被删除了,因为它询问接口是存储在堆栈还是堆中,而且,正如我们都应该知道的那样,考虑到它们之间的值和引用类型之间的差异更具建设性.语义而不是它们的实现.有关讨论,请参阅Eric Lippert的堆栈是一个实现细节.)
我有以下方法:
public static T ExecuteScalar<T>(
string query,
SqlConnection connection,
params SqlParameter[] parameters) where T : new()
{
// Create SqlCommand
SqlCommand command = CreateCommand(query, connection, parameters);
// Execute command using ExecuteScalar
object result = command.ExecuteScalar();
// Return value as expected type
if (result == null || result is DBNull) return default(T);
return (T)result;
}
Run Code Online (Sandbox Code Playgroud)
我希望MIN_ACTIVE_ROWVERSION将数据库作为一个ulong.奇怪的是..下面的第一个方法调用生成错误,但第二个方法调用工作正常.
方法调用1生成错误:
ulong minActiveRowversion =
SqlUtils.ExecuteScalar<ulong>(
"SELECT CAST(MIN_ACTIVE_ROWVERSION() AS BIGINT)"
, _connectionString);
Run Code Online (Sandbox Code Playgroud)
错误:
System.InvalidCastException: Specified cast is not valid.
Run Code Online (Sandbox Code Playgroud)
方法调用2工作正常: …
可能重复:
为什么这种转换不起作用?
嗨,我发现了一个奇怪的框架行为.此代码抛出异常:
byte a = 1;
object b = a;
Console.WriteLine(b.GetType());
Console.WriteLine((byte)b);
Console.WriteLine((int)(byte)b);
Console.WriteLine(Convert.ToInt32(b));
Console.WriteLine((int)b);
Run Code Online (Sandbox Code Playgroud)
最后一行抛出System.InvalidCastException.
我想知道框架中使这段代码非法的机制是什么.
这是装箱/拆箱的问题吗?!
protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
var fP18VaR = (float) (int)e.Values[0];
}
Run Code Online (Sandbox Code Playgroud)
我越来越
InvalidCastException - 指定的强制转换无效
为什么不起作用?
e.Values [0]的值是:6 666,00
我有这个方法:
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])它时工作得很好.问题是什么?
为什么抛出InvalidCastException?有人可以形容我这种行为吗?
object zero = 0;
decimal? dec = (decimal?)zero;
Run Code Online (Sandbox Code Playgroud) 在判断此问题已得到回答之前,请阅读说明。我在下面有这个简单的代码:
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)
请对此有所启发。谢谢!