这部分代码负责从键盘捕获用户输入并使用它。当我按下键盘变量 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;
并且错误消失,但是我在接收此值的后处理方面存在问题。
答案 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;
}