Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 来自'的无效强制转换;系统。双';至';系统。可为空`_C#_Data Conversion - Fatal编程技术网

C# 来自'的无效强制转换;系统。双';至';系统。可为空`

C# 来自'的无效强制转换;系统。双';至';系统。可为空`,c#,data-conversion,C#,Data Conversion,我有一个基于这个初始值的函数 公共静态T ConvertFromDB(对象值) { 返回值==DBNull.value?默认值(T):(T)Convert.ChangeType(value,typeof(T)); } 它很好用。但是,当传入类似于0的双精度时,我得到以下异常: 从“System.Double”到的强制转换无效 'System.Nullable`1[[System.Double,mscorlib,Version=4.0.0.0, 区域性=中性,PublicKeyToken=b77

我有一个基于这个初始值的函数

公共静态T ConvertFromDB(对象值)
{
返回值==DBNull.value?默认值(T):(T)Convert.ChangeType(value,typeof(T));
}
它很好用。但是,当传入类似于0的双精度时,我得到以下异常:

从“System.Double”到的强制转换无效 'System.Nullable`1[[System.Double,mscorlib,Version=4.0.0.0, 区域性=中性,PublicKeyToken=b77a5c561934e089]]”


我试过用浮子来铸造,但还是一样。知道为什么会发生这种情况吗?

很简单:不支持使用
Convert.ChangeType
。您需要为其提供不可为空的形式,即
double
。您可以使用
null.getUnderlineType

return value == DBNull.Value ? default(T) : (T)Convert.ChangeType(value,
      Nullable.GetUnderlyingType(typeof(T)) ?? typeof(T));
但这将有开销;就我个人而言,我怀疑使用
Nullable
特定方法可能更容易:

public static T? GetValue<T>(object value) where T : struct
{
    if(value == null || value is DBNull) return null;
    if(value is T) return (T)value;
    return (T)Convert.ChangeType(value, typeof(T));
}
publicstatict?GetValue(对象值),其中T:struct
{
如果(value==null | | value为DBNull)返回null;
如果(值为T),则返回(T)值;
return(T)Convert.ChangeType(value,typeof(T));
}

或者更好的方法是:使用ORM或micro ORM,这样你就不需要做这件事了(另外:他们会做得更好,在元编程代码中考虑类型转换,而不是每值执行代码)。

谢谢。我是否必须调用像(double)GetValue(0);,因为不是所有的返回类型都是nullable@Tommo1977同样,对于“可能有null”和“不会有null”,可能需要有不同的实现(不同的方法名称),并且对于“string”可能需要再次分开。然而,我还要重申,像“整洁”这样的工具在这方面会比你做得更好;如果这是阅读ADO.NET数据,请考虑使用这样的库
public static T? GetValue<T>(object value) where T : struct
{
    if(value == null || value is DBNull) return null;
    if(value is T) return (T)value;
    return (T)Convert.ChangeType(value, typeof(T));
}