0

我在这里尝试做一件非常简单的事情-

我需要在表格布局面板中找到一个控件

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>' 

谷歌上有很多解决方案,但没有一个对我有用,我没有找到任何无效的解决方案,卡在里面,需要帮助。

提前致谢。

4

6 回答 6

5

Dispose不返回任何东西,它的返回值为void. void不能分配给变量。

在您的场景中使用条件运算符真的没有任何意义。只需使用这个:

var control = tableLayoutExamPanel.Controls.Find("lbl3", true)[0];
if(control.Name==("lbl3"))
    control.Dispose();
于 2013-06-24T08:31:39.367 回答
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 属性搜索控件并构建一个包含所有匹配控件的数组。

因此无需检查名称,但检查是否已检索到至少一个控件会更安全

于 2013-06-24T08:32:25.507 回答
1

“我决定使用条件运算符”

不。

没有理由为此使用条件运算符,因为您不希望获得值。它只会使代码更难理解,因为您正在将实际工作作为表达式的副作用,并得到一个无意义的值作为结果。

您收到错误的原因是一个操作数正在返回null,而另一个操作数根本没有返回任何内容。要使用条件运算符,两个操作数都必须返回一个值,并且这些值必须兼容。

只需使用一个if语句:

Control c = tableLayoutExamPanel.Controls.Find("lbl3", true)[0];
if (c.Name==("lbl3")) {
  c.Dispose();
}
于 2013-06-24T08:31:37.900 回答
0

您不能分配nullvar temp,请参阅此页面http://www.dotnetperls.com/var。请改用任何其他值。除此之外,请确保您的Dispose函数返回一个不等于voidand的值null

于 2013-06-24T08:31:16.063 回答
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 条件运算符)

于 2013-06-24T08:37:50.323 回答
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 ;
于 2013-06-24T08:42:50.170 回答