我有这个功能检查当前值.当前值(第一个参数)为空或空时,它使用您传递的默认值(第二个参数)
public static T ZeroNull<T>(object currentValue, T defaultValue)
{
if (currentValue.Equals(DBNull.Value))
return (T)defaultValue;
else if (currentValue.Equals(string.Empty))
return (T)defaultValue;
else
return (T)currentValue;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码工作正常,部分...但是当我使用这样的代码时,它会抛出" 指定的强制转换无效...... "
float currValue = 20.1f;
int i = ZeroNull<int>(currValue, 0); // Specified cast is not valid
int i = ZeroNull<int>("10", 0); // Specified cast is not valid
Run Code Online (Sandbox Code Playgroud)
有人可以改进上面的代码片段吗?为什么编译器会抛出此错误?
此致,杰西
您可以尝试使用IConvertible接口,因此它至少对实现该接口的类型有效。当心,对于不使用它的类型,它仍然会引发异常,但是对于您的转换来说,它做的很好:
public static T ZeroNull<T>(object currentValue, T defaultValue)
{
if (currentValue.Equals(DBNull.Value))
return (T)defaultValue;
else if (currentValue.Equals(string.Empty))
return (T)defaultValue;
else
return (T)Convert.ChangeType(currentValue,typeof(T));
}
Run Code Online (Sandbox Code Playgroud)
关于从float到int的转换:您正在尝试转换盒装类型-在调用将其有效转换为对象的方法时,将其转换为盒装类型。装箱的类型只能强制回退。由于强制转换为int的类型不同,因此它将不起作用。要在没有泛型的情况下重试,请尝试以下操作InvalidCastException:
float currValue = 20.1f;
object yourValue = currValue;
int i = (int) yourValue; //throws as well
Run Code Online (Sandbox Code Playgroud)