问题是由于强制转换和显式运算符:
(byte)objectExpression与(byte)sbyteExpression不同.
第一个是[direct]强制转换失败,因为真实对象类型是sbyte而不是byte.后者将执行转换,恰好使用带有语法的显式运算符(“显式转换”),遗憾的是,仍然看起来像上面的[direct]强制转换.这是一个失败sans-database的例子:
var obj = (object)(sbyte)0;
var i1 = (int)(sbyte)obj; // okay: object (cast)-> sbyte (conversion)-> int
var i2 = (int)obj; // fail: sbyte (cast)-> int (but sbyte is not int!)
要么使用对实际对象类型有效的(sbyte)objectExpression强制转换,要么使用Convert.ToInt32(objectExpression),它接受一个对象并做一些魔法将其转换为int. (使用Convert.ToByte可能会在溢出时抛出异常.)
快乐的编码!