C#泛型问题

C#泛型问题,c#,generics,C#,Generics,我有一个方法(见下文) public T ExecuteScalar(字符串sSql,参数SqlParameter[]parameters) { 如果(!string.IsNullOrEmpty(sSql)) { DataAccess dal=新的DataAccess(ConnectionString); DebugOutput_SQL(sSql,参数); 对象值=空; value=dal.ExecuteScalar(sSql,参数); if(value!=null&&value!=DBNull

我有一个方法(见下文)

public T ExecuteScalar(字符串sSql,参数SqlParameter[]parameters)
{
如果(!string.IsNullOrEmpty(sSql))
{
DataAccess dal=新的DataAccess(ConnectionString);
DebugOutput_SQL(sSql,参数);
对象值=空;
value=dal.ExecuteScalar(sSql,参数);
if(value!=null&&value!=DBNull.value)
返回(T)值;
}
返回默认值(T);
}
我称之为

 int32 WorkFlowID = DataProvider.ExecuteScalar<Int32>(sSql);
int32 WorkFlowID=DataProvider.ExecuteScalar(sSql);
然后它在“return(t)value”行中给了我一个错误“Don't unbox to value”,对此有什么建议。

“Don't unbox to value”听起来像是一条奇怪的错误消息。这就是它说的吗

我猜想,
ExecuteScalar
返回的是不同的类型(
long
double
等),而不是
int
。在转换为
T
之前,请尝试记录
value.GetType()

作为旁注,这是:

object value = null;
value = dal.ExecuteScalar(sSql, parameters);
将更简单(国际海事组织),因为:

这里没有必要把它放在两个语句中

编辑:只是想澄清一下,它失败的原因是,当您取消装箱一个值时,您必须取消装箱到实际的类型,而不仅仅是一个有转换可用的类型。例如,如果希望最终得到一个
int
,可以执行以下操作:

int x = (int) (decimal) value;
这将取消X到小数点,然后将小数点转换为整数。不过在这种情况下,如果可能的话,我只需要指定正确的开始类型:)

“不要取消对值的装箱”听起来像是一条奇怪的错误消息。这就是它说的吗

我猜想,
ExecuteScalar
返回的是不同的类型(
long
double
等),而不是
int
。在转换为
T
之前,请尝试记录
value.GetType()

作为旁注,这是:

object value = null;
value = dal.ExecuteScalar(sSql, parameters);
将更简单(国际海事组织),因为:

这里没有必要把它放在两个语句中

编辑:只是想澄清一下,它失败的原因是,当您取消装箱一个值时,您必须取消装箱到实际的类型,而不仅仅是一个有转换可用的类型。例如,如果希望最终得到一个
int
,可以执行以下操作:

int x = (int) (decimal) value;

这将取消X到小数点,然后将小数点转换为整数。不过,在这种情况下,如果可能的话,我只需要指定正确的类型:)

可能您收到的值对象是可空的,在这种情况下,您可以这样做

return ((Nullable<T>)value).Value;
返回((可空)值).value;

也许您收到的值对象是可空的,在这种情况下您可以这样做

return ((Nullable<T>)value).Value;
返回((可空)值).value;
您可以尝试:

public T ExecuteScalar<T>(string sSql, params SqlParameter[] parameters)
{
    if (!string.IsNullOrEmpty(sSql))
    {
        DataAccess dal = new DataAccess(ConnectionString);
        DebugOutput_SQL(sSql, parameters);
        object value = null;
        value = dal.ExecuteScalar(sSql, parameters);

        if (value != null && value != DBNull.Value)
            return (T) Convert.ChangeType(value, typeof(T));
    }
    return default(T);
}
public T ExecuteScalar(字符串sSql,参数SqlParameter[]parameters)
{
如果(!string.IsNullOrEmpty(sSql))
{
DataAccess dal=新的DataAccess(ConnectionString);
DebugOutput_SQL(sSql,参数);
对象值=空;
value=dal.ExecuteScalar(sSql,参数);
if(value!=null&&value!=DBNull.value)
return(T)Convert.ChangeType(value,typeof(T));
}
返回默认值(T);
}
您可以尝试:

public T ExecuteScalar<T>(string sSql, params SqlParameter[] parameters)
{
    if (!string.IsNullOrEmpty(sSql))
    {
        DataAccess dal = new DataAccess(ConnectionString);
        DebugOutput_SQL(sSql, parameters);
        object value = null;
        value = dal.ExecuteScalar(sSql, parameters);

        if (value != null && value != DBNull.Value)
            return (T) Convert.ChangeType(value, typeof(T));
    }
    return default(T);
}
public T ExecuteScalar(字符串sSql,参数SqlParameter[]parameters)
{
如果(!string.IsNullOrEmpty(sSql))
{
DataAccess dal=新的DataAccess(ConnectionString);
DebugOutput_SQL(sSql,参数);
对象值=空;
value=dal.ExecuteScalar(sSql,参数);
if(value!=null&&value!=DBNull.value)
return(T)Convert.ChangeType(value,typeof(T));
}
返回默认值(T);
}

我们能看到DataAccess.ExecuteScalar()方法吗?是来自某种VS加载项的错误吗?我们能看到DataAccess.ExecuteScalar()方法吗?是来自某种VS加载项的错误吗?谢谢Jon,你是对的,我检查了十进制类型的值。我很确定你的推理是正确的,但可能值得解释的是,值类型只会被解除绑定到指定的确切类型(例如,即使类型转换是隐式的,也不能将int解除绑定到long)。谢谢Jon,你是对的,我检查了十进制类型的值。我很确定你的推理是正确的,但可能值得解释的是,值类型将只取消绑定到指定的确切类型(例如,即使类型转换是隐式的,也不能将int取消绑定到long)。