指定的转换对泛型无效

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