【问题标题】:implicit conversion between 'void' and '<null>'?'void' 和 '<null>' 之间的隐式转换?
【发布时间】:2023-03-17 13:01:01
【问题描述】:

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

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

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

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

提前致谢。

【问题讨论】:

  • 尽量不要使用var关键字,因为编译器无法从这两部分推断出类型。
  • @SteveB:这不是这里的问题。
  • 是的,我后来明白了。我也赞成你的回答:)

标签: c# winforms conditional-operator


【解决方案1】:

Dispose 不返回任何内容,它的返回值为voidvoid 不能分配给变量。

在您的场景中使用条件运算符确实毫无意义。只需使用这个:

var control = tableLayoutExamPanel.Controls.Find("lbl3", true)[0];
if(control.Name==("lbl3"))
    control.Dispose();

【讨论】:

    【解决方案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 属性搜索控件并构建一个数组 所有匹配的控件。

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

    【讨论】:

      【解决方案3】:

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

      不要。

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

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

      只需使用if 声明:

      Control c = tableLayoutExamPanel.Controls.Find("lbl3", true)[0];
      if (c.Name==("lbl3")) {
        c.Dispose();
      }
      

      【讨论】:

        【解决方案4】:

        您不能将null分配给var temp,请参阅此页面http://www.dotnetperls.com/var。请改用任何其他值。 除此之外,请确保您的 Disposefunction 返回的值不等于 voidnull

        【讨论】:

        • 虽然如此,但这不是这里的问题。
        【解决方案5】:

        你可以把你的代码改成这样:

        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 条件运算符)

        【讨论】:

          【解决方案6】:

          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 ;
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-09-01
            • 2013-12-22
            • 2015-07-14
            • 2019-03-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多