InvalidCastException:指定的强制转换无效

时间:2014-04-23 05:37:07

标签: c# database casting

这部分代码负责从键盘捕获用户输入并使用它。当我按下键盘变量 TAG 上的某个按钮(例如C)时,将其作为对象(字节)值 3 接收。我无法找出调试器返回以下错误的原因: System.InvalidCastException。指定的演员表无效 num 标记声明为整数值。怎么了?在这一行 int? tag =(int?)this.pnlAnswers.Controls [num.Value] .Tag; - 调试器指向行尾的.Tag作为错误。

    private void Question_KeyDown(object sender, KeyEventArgs e)
    {
        int? num = null;
        this.qta.get_answer_number_by_key(new int?(e.KeyValue), ref num);
        if (!num.HasValue)
        {
            this.SwitchQuestion(e.KeyValue);
        }
        else
        {
            num -= 1;
            bool? nullable2 = false;
            bool? end = false;
            if (this.pnlAnswers.Controls.Count >= (num + 1))
            {
                Valid valid;
                int? tag = (int?) this.pnlAnswers.Controls[num.Value].Tag;
                this.qta.test_answer(this.q, tag, ref nullable2, ref end, ref this.pass);
                this.e = end.Value;
                if (nullable2.Value)
                {
                    valid = new Valid(MessageType.Valid);
                }
                else
                {
                    valid = new Valid(MessageType.Invalid);
                }
                valid.ShowDialog();
                base.Close();
            }
        }
    }

我试图改变

int? tag = (int?) this.pnlAnswers.Controls[num.Value].Tag;

byte? tag = (byte?) this.pnlAnswers.Controls[num.Value].Tag;

并且错误消失,但是我在接收此值的后处理方面存在问题。

2 个答案:

答案 0 :(得分:3)

您需要将Tag属性引用的对象强制转换为byte的实际类型。然后,您可以对byte对象进行进一步转换:

byte tagByte = (byte)this.pnlAnswers.Controls[num.Value].Tag);
int? tag = (int?) tagByte;
//or in short :
//int? tag = (byte)this.pnlAnswers.Controls[num.Value].Tag;

我做了简单的测试来确认这种行为:

byte initialValue = 3;
object TAG = initialValue;
int? tagSuccess = (int?)((byte)TAG); //successfully convert TAG to type int?
int? tagFails = (int?)TAG; //throw InvalidCastException

答案 1 :(得分:0)

接受的答案并不总是有效。

在Visual Studio表单设计器的属性编辑器中将Tag设置为1时,将为其分配字符串类型,即“ 1”。您会在调试器中看到发生异常时的情况。有引号。

不能将字符串直接转换为任何数字类型。在这种情况下,(字节)将产生相同的异常。

这是用于字符串或整数类型的标记的常规但肮脏的解决方案。

   private int TagValue(object cTag)
    {
        int iTag = 0;
        try { iTag = (int)cTag; } catch { iTag = int.Parse((string)cTag); }
        return iTag;
    }