'void'和'<null>'之间的隐式转换?</null>

时间:2013-06-24 08:25:55

标签: c# winforms conditional-operator

我想在这里做一件非常简单的事 -

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

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>' 
谷歌有很多解决方案,但没有一个能为我工作,我没有找到任何无效的解决方案,坚持下去,需要帮助。

提前致谢。

6 个答案:

答案 0 :(得分:5)

Dispose不返回任何内容,返回值为voidvoid无法分配给变量。

在你的场景中使用条件运算符根本没有任何意义。只需使用:

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函数返回的值不等于voidnull

答案 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 ;