指定的转换对泛型无效
Specified cast not valid with generic
我有这个检查当前值的功能。当当前值(第一个参数)为 null 或空时,它使用您传递的默认值(第二个参数)
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;
}
上面的代码部分工作正常......但是当我使用这样的代码时,它会抛出“指定的转换无效......"
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
有人可以改进上面的代码片段吗?为什么编译器会抛出这个错误?
此致,
杰西
您遇到的问题是您无法将 String 转换为 int,而当 T 的类型为 int 时,您正试图通过将 currValue 转换为 T 来做到这一点。
要执行此类操作,您必须使用 Convert.ToInt32 或 Int.Parse。其中任何一个都会破坏您当前的设计。
您可以尝试使用 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));
}
关于从 float 到 int 的转换:您正在尝试转换装箱类型 - 当您调用有效地将其转换为对象的方法时,它被装箱。盒装类型只能转换回它们自己。由于转换为 int 的类型不同,因此它不会起作用。要在没有泛型的情况下重现试试这个,它也会抛出一个 InvalidCastException
:
float currValue = 20.1f;
object yourValue = currValue;
int i = (int) yourValue; //throws as well
我有这个检查当前值的功能。当当前值(第一个参数)为 null 或空时,它使用您传递的默认值(第二个参数)
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;
}
上面的代码部分工作正常......但是当我使用这样的代码时,它会抛出“指定的转换无效......"
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
有人可以改进上面的代码片段吗?为什么编译器会抛出这个错误?
此致, 杰西
您遇到的问题是您无法将 String 转换为 int,而当 T 的类型为 int 时,您正试图通过将 currValue 转换为 T 来做到这一点。
要执行此类操作,您必须使用 Convert.ToInt32 或 Int.Parse。其中任何一个都会破坏您当前的设计。
您可以尝试使用 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));
}
关于从 float 到 int 的转换:您正在尝试转换装箱类型 - 当您调用有效地将其转换为对象的方法时,它被装箱。盒装类型只能转换回它们自己。由于转换为 int 的类型不同,因此它不会起作用。要在没有泛型的情况下重现试试这个,它也会抛出一个 InvalidCastException
:
float currValue = 20.1f;
object yourValue = currValue;
int i = (int) yourValue; //throws as well