簡體   English   中英

“ void”和“之間的隱式轉換 <null> &#39;?

[英]implicit conversion between 'void' and '<null>'?

我正在嘗試在這里做一件非常簡單的事情-

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

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

google上有很多解決方案,但沒有一個對我有用,而且我沒有發現任何針對null和void的解決方案,都需要幫助。

提前致謝。

Dispose不返回任何內容,它的返回值為void 不能將void分配給變量。

在您的方案中使用條件運算符真的沒有任何意義。 只需使用以下命令:

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

在使用三元運算符的條件表達式中,表達式的兩側應返回相同的值。 在您的表達式中,第一面返回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屬性搜索控件,並構建所有匹配控件的數組。

因此,無需對照名稱進行檢查,但是檢查是否至少已檢索到一個控件更安全。

“我決定為此使用條件運算符”

別。

沒有理由為此使用條件運算符,因為您不希望獲得值。 這將使代碼更難於理解,因為您實際上是在做表達式的副作用,並得到一個無意義的值。

出現錯誤的原因是,一個操作數返回null ,而另一個操作數根本不返回任何內容。 要使用條件運算符,兩個操作數都必須返回一個值,並且這些值必須兼容。

只需使用一條if語句:

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

您無法將var temp分配為null ,請參閱此頁面http://www.dotnetperls.com/var 改用其他任何值。 除此之外,請確保Dispose函數返回的值不等於voidnull

您可以將代碼更改為以下內容:

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/zh-cn/download/confirmation.aspx?id= 7029(7.14有條件的運算符)

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 ;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM