我想在这里做一件非常简单的事 -
我需要在表格布局面板中找到一个控件
1)如果控件存在 - 删除控件
2)否则我不需要做任何事情
除了if \ else之外,我决定使用条件运算符。我的代码是:
var temp=(tableLayoutExamPanel.Controls.Find("lbl3", true)[0].Name==("lbl3")) ? (tableLayoutExamPanel.Controls.Find("lbl3", true)[0].Dispose()) : null ;
但是我遇到了这个错误:
Type of conditional expression cannot be determined because there is no implicit conversion between 'void' and '<null>'
谷歌有很多解决方案,但没有一个能为我工作,我没有找到任何无效的解决方案,坚持下去,需要帮助。
提前致谢。
答案 0 :(得分:5)
Dispose
不返回任何内容,返回值为void
。 void
无法分配给变量。
在你的场景中使用条件运算符根本没有任何意义。只需使用:
var control = tableLayoutExamPanel.Controls.Find("lbl3", true)[0];
if(control.Name==("lbl3"))
control.Dispose();
答案 1 :(得分:2)
在使用三元运算符的条件表达式中,表达式的两边应返回相同的值。在你的表达式中,第一面返回void,第二面返回null,两者不是同一个东西。
你见过这样的事吗:
var test = void; // <- doesn't compile
我发现你对条件运算符的使用非常混乱而且不需要
我认为这更清楚
var temp=tableLayoutExamPanel.Controls.Find("lbl3", true);
if(temp != null && temp.Length > 0)
temp[0].Dispose();
顺便说一下,ControlsCollection类的Find方法
通过Name属性搜索控件并构建一个数组 所有匹配的控件。
因此无需检查名称,但检查是否至少检索到一个控件更安全
答案 2 :(得分:1)
“我决定使用条件运算符”
别。
没有理由为此使用条件运算符,因为您不希望获得值。它只会使代码更难理解,因为你将实际工作作为表达式的副作用,并获得无意义的值作为结果。
您得到错误的原因是一个操作数返回null
而另一个操作数根本没有返回任何内容。要使用条件运算符,两个操作数都必须返回一个值,并且值必须兼容。
只需使用if
声明:
Control c = tableLayoutExamPanel.Controls.Find("lbl3", true)[0];
if (c.Name==("lbl3")) {
c.Dispose();
}
答案 3 :(得分:0)
您无法将null
分配给var temp
,请参阅此页http://www.dotnetperls.com/var。请改用其他任何值。
除此之外,请确保您的Dispose
函数返回的值不等于void
和null
。
答案 4 :(得分:0)
您可以将代码更改为以下内容:
var temp = (tableLayoutExamPanel.Controls.Find("lbl3", true)[0].Name == ("lbl3"))
tableLayoutExamPanel.Controls.Find("lbl3", true)[0] : null;
if ( temp != null )
temp.Dispose();
详情请查看: http://www.microsoft.com/en-us/download/confirmation.aspx?id=7029(7.14条件运算符)
答案 5 :(得分:0)
void
不是真正的数据类型,它用于声明方法不返回任何值。为了解决这个问题,我认为你可以这样做:
public static class ControlExtension {
public static object Dispose2(this Control c){
c.Dispose();
return null;//or anything you want
}
}
//Then
var temp=(tableLayoutExamPanel.Controls.Find("lbl3", true)[0].Name==("lbl3")) ? (tableLayoutExamPanel.Controls.Find("lbl3", true)[0].Dispose2()) : null ;