Вы должны рассмотреть, что произойдет, если частичный метод не будет реализован.
В таком случае происходит то, что все вызовы метода просто отбрасываются, как если бы они никогда не происходили.
Таким образом, для метода, использующего out, он будет выглядеть так:
stream s;
GetStream(out s);
s.Write(...);
и будет скомпилирован так, как если бы он сказал это:
stream s;
s.Write(...);
Этот код не разрешен, поскольку s
имеетне был инициализирован.Гарантия того, что переменная будет инициализирована к тому времени, когда вы попытаетесь вызвать для нее метод Write
, была связана с вызовом GetStream
.
То же самое с методами, возвращающими данные.Поскольку весь вызов метода просто не скомпилирован, если вы не реализовали частичный метод, вам нужно подумать о том, что вы можете и не можете сделать, и все же оставить код, который вызывает его, допустимым.С точки зрения out
и возвращаемых значений, он может оставить вызывающий код недействительным или неполным, поэтому он не допускается.
Что касается ref
, то это действительно с момента инициализациизабота по телефонному коду:
stream s = null;
GetStream(ref s); // may be stripped out
if (s != null)
s.Write(...);