3

いくつかのチュートリアルを行っているときに、次のような行に遭遇しました。

((IDisposable)foo).Dispose();

Idisposableへの特定の参照を無視します。かっこがなぜそのように設定されているのか、そしてそれらが何を含んでいるのか/何をしているのかについて興味があります。これは答えるのが非常に簡単な質問だと確信していますが、そのような構文の一般的なもののために、検索しても答えを見つけることができませんでした。助けていただければ幸いです、ありがとうございます。

4

5 に答える 5

3

括弧の最初のセットは、それをIDisposableオブジェクトにキャストしています。例えば

Object foo = new Object();
IDisposable ID;

ID = fooこれでエラーが発生しますが、機能しID = (IDisposable)fooます。

2番目の括弧のセットを使用すると、IDisposableオブジェクトのメソッドとプロパティ(この場合はDispose()メソッド)にアクセスできます。入力すると、2番目の括弧のセットを囲むと、IDisposableオブジェクトのメソッドとプロパティがわかりやすく表示されます。

于 2012-06-26T14:02:31.403 に答える
2
  • 皮切りにfoo
  • プレフィックスを付け(IDisposable)て、要求されたインターフェイスにキャストします
  • これを角かっこで囲んで、.netfooにキャストするものであり、結果ではないことを伝えます。foo.Dispose()
  • .Dispose()次に、インターフェースのメソッドをアドレス指定するために追加します
于 2012-06-26T14:00:04.990 に答える
2

構文:

var d = (IDisposable)foo;

明示的なキャストと呼ばれます。

構文:

((IDisposable)foo).Dispose(); 

一時変数に明示的にキャストfooして呼び出しますDispose(ここでは一時変数使用されていますが、表示されません。コンパイラによって作成されます)。

括弧は、コンパイラーにアクションの優先順位を示します。IDisposableこの場合、呼び出しを解決する前に変数をにキャストするように指示されDisposeます。以前に行われたため、コンパイラーDisposeはタイプの変数を解決することを認識しますIDisposable

この動作は他の形式で確認できます。

(foo as IDisposable).Dispose();

または:

string s = null;

while ((s = Console.ReadLine()) != null)
{
}

私の最初の例asでは、自分のキャスト(インライン)と同じ方法で演算子を使用してキャストします。s2番目の例では、に対してテストを行う前に変数を設定しますnull

の言いたいことは、境界を定義するために角かっこを使用しないと、これらのどれもコンパイルされないということです。

于 2012-06-26T14:06:05.490 に答える
0

これは、IDisposableへの変換を行う際の単なるショートカットです。

これ...

((IDisposable)foo).Dispose(); 

これと同じです...

IDisposable i = (IDisposable)foo; 
i.Dispose();
于 2012-06-26T14:03:10.077 に答える
0

内側の括弧のセットはIDisposableそれをキャストに変え、次に外側の括弧のセットは、への呼び出しの前にキャストが発生することを保証しDispose()ます。

于 2012-06-26T14:03:26.207 に答える