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

Googleには非常に多くの解決策がありますが、どれもうまくいきません.nullとvoidの解決策が見つかりませんでした.

前もって感謝します。

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 を返し、2 番目の側は null を返し、2 つは同じものではありません。

次のようなものを見たことがありますか。

 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 プロパティでコントロールを検索し、一致するすべてのコントロールの配列を作成します。

そのため、名前を確認する必要はありませんが、少なくとも 1 つのコントロールが取得されているかどうかを確認する方が安全です。

于 2013-06-24T08:32:25.507 に答える
1

「条件演算子を使うことにしました」

しないでください。

値を取得しようとしていないため、これに条件演算子を使用する理由はありません。式の副作用として実際の作業を行い、結果としてナンセンスな値を取得しているため、コードが理解しにくくなるだけです。

取得しているエラーの理由は、1 つのオペランドが返さnullれ、もう 1 つのオペランドが何も返さないことです。条件演算子を使用するには、両方のオペランドが値を返す必要があり、値に互換性がある必要があります。

ifステートメントを使用するだけです:

Control c = tableLayoutExamPanel.Controls.Find("lbl3", true)[0];
if (c.Name==("lbl3")) {
  c.Dispose();
}
于 2013-06-24T08:31:37.900 に答える
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 に答える
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

nullに割り当てることはできません。var tempこのページhttp://www.dotnetperls.com/varを参照してください。代わりに他の値を使用してください。それに加えて、関数がand とDispose等しくない値を返すことを確認してください。voidnull

于 2013-06-24T08:31:16.063 に答える