я имел функцию, возвращавшуюся в using
блоке:C# компилятор не жалуется, когда не все пути кода возврата
int f() {
using (...) {
...
return someVar;
}
}
Я только заметил это и перевёл return
за пределы using
блока к внешнему потому что я чувствовал, что именно там должно быть return
.
Но я смущен, почему компилятор не жаловался, что не все коды кода возвращались. Это просто потому, что если ему не удалось инициализировать ресурс, мы получим крах, так что это не имеет значения?
Возьмем такой пример:
class MainClass {
public static void Main (string[] args) {
f();
}
public static int f() {
using(A a = new A()) {
return 1;
}
}
}
class A : IDisposable{
public void Dispose() { }
}
Компилятор не волнует, что мы только вернуться в using
. Тем не менее, я думал, что using
заявления были в основном синтаксический сахар для try/catch
Если заменить
using(A a = new A()) {
return 1;
}
с
A a = new A();;
try {
return 1;
}
catch (Exception e) { }
finally {
if (a != null) {
((IDisposable) a).Dispose();
}
}
Действительно, компилятор жалуется: CS0161
ошибка: `MainClass .f() ': не все пути кода возвращают значение
Почему он не жалуется в другом случае?
Это просто то, что я сказал выше? Если он не может инициализировать ресурс, мы получим крах, поэтому компилятор решит, что это не имеет значения.
Это просто «try-finally», нет «catch». Если вы удалите 'catch' в своем коде, вы не получите ошибку компиляции. – juharr
Почему вы хотите вытащить 'return' из' use'? Это делает код намного сложнее и труднее читать, не добавляя ничего взамен. – Servy
@Servy Я не понимаю, как это делает его «намного сложнее». Причина в том, что я хочу вернуться в самый отдаленный блок - это как-то кажется более правильным. – pushkin