Синтаксис:
var d = (IDisposable)foo;
называется Явная Cast.
Синтаксис:
((IDisposable)foo).Dispose();
Явное бросает foo
во временную переменную и вызывает Dispose
на нем (сделать примечание, временная переменная является используется здесь, но вы не можете видеть его, он создается компилятор).
Скобки сообщают компилятору порядок приоритетности действий. В этом случае говорится о том, чтобы передать переменную IDisposable
перед разрешением вызова Dispose
.Поскольку это сделано раньше, компилятор теперь знает, чтобы разрешить Dispose
по переменной типа IDisposable
.
Вы можете увидеть это поведение в других формах:
(foo as IDisposable).Dispose();
Или:
string s = null;
while ((s = Console.ReadLine()) != null)
{
}
Мой первый пример бросает с помощью оператора as
таким же образом, как свой собственный бросок (в линию) , Мой второй пример устанавливает переменную s
перед тем, как протестировать ее против null
.
Моей точкой является, ни одна из них не будет компилироваться без использования скобок для определения границ.
Возможно, вам интересно, почему вам нужно бросить перед вызовом Dispose, поскольку вы, вероятно, уже статически знаете, что 'foo' является' IDisposable'. Если 'foo''s, тип реализует' IDisposable' явно, то вы не можете напрямую вызывать 'foo.Dispose()', и вам нужно сделать это в первую очередь. http://msdn.microsoft.com/en-us/library/ms173157.aspx (ответ @ EugenRieck ответил на синтаксис, который был основной частью, я полагал, что это лучше подходит для комментариев) –
Чтобы продолжить распространение комментария @ TimS, объект также необязательно входит в цепочку наследования того, что вы делаете в/из, поскольку пользовательские явные или неявные операторы литья могут позволить вам использовать в/из полностью несвязанных типов (хотя у него есть ограничения, например, без разрешенных интерфейсов). –