C# 指定的强制转换无效#3

C# 指定的强制转换无效#3,c#,C#,我遇到了这个问题,在Visual Studio内部的错误列表中没有收到“指定的强制转换无效”错误。此错误可能来自我的Access数据库吗 private void Submit_Click(object sender, EventArgs e) { String desItem = desWork.Text; decimal partscost = Convert.ToDecimal(textBoxPartsCost.Text); decimal laborhours =

我遇到了这个问题,在Visual Studio内部的错误列表中没有收到“指定的强制转换无效”错误。此错误可能来自我的Access数据库吗

private void Submit_Click(object sender, EventArgs e)
{
    String desItem = desWork.Text;
    decimal partscost = Convert.ToDecimal(textBoxPartsCost.Text);
    decimal laborhours = Convert.ToDecimal(textBoxHours.Text);
    decimal laborrate = Convert.ToDecimal(textBoxRate.Text);
    decimal total = laborhours * laborrate + partscost;

    try
    {
        servicesTableAdapter.InsertServices((short?)comboBoxCustomer.SelectedValue, (DateTime?)dateTimePickerServiceDate.Value, desItem, partscost, laborhours, laborrate, total);
        MessageBox.Show("Services Inserted", "Succes!", MessageBoxButtons.OK, MessageBoxIcon.Information);
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

我认为它可能来自于ComboxCustomer.SelectedValue的
(short?)组合框,因为在Visual Studio中,它告诉我需要转换为一个简短但内部的访问,我使用的是长整数。不知道为什么会这样。有人能告诉我我做错了什么吗?

你的猜测几乎肯定是正确的

装箱的值类型只能解除装箱到实际的类型。如果有一个
long
,则不能直接将其解装箱到
short?
。您必须先将其取消装箱到
long
(或
long?
),然后将其转换为
short?

这是一个非常常见的问题。关于这个问题的详细解释,请参阅我的文章


你的猜测几乎肯定是正确的

装箱的值类型只能解除装箱到实际的类型。如果有一个
long
,则不能直接将其解装箱到
short?
。您必须先将其取消装箱到
long
(或
long?
),然后将其转换为
short?

这是一个非常常见的问题。关于这个问题的详细解释,请参阅我的文章


我强烈建议您不要将
ex.Message
用作诊断输出。改为使用
ex.ToString()
,它将向您显示整个堆栈跟踪,包括任何内部异常。您能告诉我们堆栈跟踪和错误列吗?@JohnSaunders最终用户可能不需要被堆栈跟踪吓到。@ByteBlast:我没有说过向最终用户显示堆栈跟踪。我是在向开发人员谈论诊断输出。此外,异常消息并不意味着友好的最终用户错误消息。“指定的强制转换无效”对最终用户没有任何意义。您是遇到运行时错误还是编译时错误?您可以发布InsertServices方法和SelectedValue属性的签名吗?如果是编译时错误,您能将VS信号的行拆分为较短的语句吗?这将帮助您准确诊断代码的哪一部分无效。我强烈建议您不要使用
ex.Message
作为诊断输出。改为使用
ex.ToString()
,它将向您显示整个堆栈跟踪,包括任何内部异常。您能告诉我们堆栈跟踪和错误列吗?@JohnSaunders最终用户可能不需要被堆栈跟踪吓到。@ByteBlast:我没有说过向最终用户显示堆栈跟踪。我是在向开发人员谈论诊断输出。此外,异常消息并不意味着友好的最终用户错误消息。“指定的强制转换无效”对最终用户没有任何意义。您是遇到运行时错误还是编译时错误?您可以发布InsertServices方法和SelectedValue属性的签名吗?如果是编译时错误,您能将VS信号的行拆分为较短的语句吗?这将帮助您准确地诊断代码的哪一部分无效。为什么Visual Studio建议我将其转换为
short?
呢?@ClaudeGrecea它的意思是,您需要的结果必须是
short?
,因此您需要使用一些转换运算符或转换运算符的组合才能达到目的。在这种情况下,不需要简单的强制转换appropriate@Servy但是,当数据库中的值很长时,为什么结果很短?Visual Studio是否应该使用与我在Access中描述的相同的强制转换,或者是VS选择最适合这种情况的强制转换来保留内存?为什么Visual Studio建议我将其强制转换为
简短?
?。@Claudegreecea这是说您需要的结果必须是
简短?
,因此,您需要使用一些强制转换或转换运算符的组合才能达到目的。在这种情况下,不需要简单的强制转换appropriate@Servy但是,当数据库中的值很长时,为什么结果很短?VisualStudio不应该使用与我在Access中描述的相同的演员阵容吗?还是应该选择最适合这种情况的演员阵容来保留内存?