いくつかのチュートリアルを行っているときに、次のような行に遭遇しました。
((IDisposable)foo).Dispose();
Idisposableへの特定の参照を無視します。かっこがなぜそのように設定されているのか、そしてそれらが何を含んでいるのか/何をしているのかについて興味があります。これは答えるのが非常に簡単な質問だと確信していますが、そのような構文の一般的なもののために、検索しても答えを見つけることができませんでした。助けていただければ幸いです、ありがとうございます。
いくつかのチュートリアルを行っているときに、次のような行に遭遇しました。
((IDisposable)foo).Dispose();
Idisposableへの特定の参照を無視します。かっこがなぜそのように設定されているのか、そしてそれらが何を含んでいるのか/何をしているのかについて興味があります。これは答えるのが非常に簡単な質問だと確信していますが、そのような構文の一般的なもののために、検索しても答えを見つけることができませんでした。助けていただければ幸いです、ありがとうございます。
括弧の最初のセットは、それをIDisposableオブジェクトにキャストしています。例えば
Object foo = new Object();
IDisposable ID;
ID = fooこれでエラーが発生しますが、機能しID = (IDisposable)fooます。
2番目の括弧のセットを使用すると、IDisposableオブジェクトのメソッドとプロパティ(この場合はDispose()メソッド)にアクセスできます。入力すると、2番目の括弧のセットを囲むと、IDisposableオブジェクトのメソッドとプロパティがわかりやすく表示されます。
foo(IDisposable)て、要求されたインターフェイスにキャストしますfooにキャストするものであり、結果ではないことを伝えます。foo.Dispose().Dispose()次に、インターフェースのメソッドをアドレス指定するために追加します構文:
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。
私の言いたいことは、境界を定義するために角かっこを使用しないと、これらのどれもコンパイルされないということです。
これは、IDisposableへの変換を行う際の単なるショートカットです。
これ...
((IDisposable)foo).Dispose();
これと同じです...
IDisposable i = (IDisposable)foo;
i.Dispose();
内側の括弧のセットはIDisposableそれをキャストに変え、次に外側の括弧のセットは、への呼び出しの前にキャストが発生することを保証しDispose()ます。