Нет предупреждения в VB.NET, когда функция не возвращает - PullRequest
6 голосов
/ 26 февраля 2010

Некоторые комментарии по вопросу переполнения стека Почему компилятор C # не мешает свойствам ссылаться на себя? относительно предупреждений, заставляющих меня задуматься о старых проблемах, которые всегда обманывают меня, когда я писал больше кода VB.NET.

Одним из них был тот факт, что компилятор не предупреждал, если вы объявили функцию, но никогда не делал явного оператора Return или присваивал имя функции. Запустив Visual Studio 2008, я только что сделал небольшой экспериментальный проект, и кажется, что поведение никогда не было исправлено. Я создал консольное приложение Visual Basic со следующим кодом:

Module MainModule

    Sub Main()

        Dim test As Boolean = TestWarning()

    End Sub

    Function TestWarning() As Boolean

        Console.WriteLine("There is no Return Statement")

    End Function

End Module

Я также зашел в настройки проекта и включил On Option Strict и Option Explicit. Я также установил конфигурации предупреждений так, чтобы для «Функция / Оператор без возвращаемого значения» было установлено значение «Ошибка».

Я скомпилировал проект и не получил ни предупреждения, ни ошибки в функции TestWarning (). Похоже, это отличное место для размещения предупреждения, поскольку по умолчанию используется значение False, и вы, возможно, просто забыли сделать возврат. C # будет ошибка без оператора возврата. Я думал, что VB.NET сделал то же самое с конфигурацией «Функция / Оператор без возвращаемого значения». Это ошибка, или мне чего-то не хватает?

Дальнейшие эксперименты

Function TestWarning() As Boolean

    If DateTime.Now.DayOfWeek = DayOfWeek.Monday Then
        Return False
    Else
        Console.WriteLine("There is no Return Statement")
    End If

End Function

Если у меня есть явный Return в If и ничего в Else, также нет предупреждений или ошибок. Он просто примет значение по умолчанию, даже если вы, вероятно, намеревались (через стиль программирования) получить явный возврат. В этом случае я явно возвратил False (по умолчанию для Boolean), так что, скорее всего, это скрытая ошибка, которую я должен был вернуть True в Else.

Ответы [ 5 ]

8 голосов
/ 26 февраля 2010

Предупреждение только сообщит вам, когда функция вернет Nothing по умолчанию.

Вы получите предупреждение, если возвращаемое значение имеет ссылочный тип.

Но ваша функция имеет возвращаемое значение типа значения, и оно не может быть Nothing. Поэтому без предупреждения.

Это потому, что имя функции внутри этой самой функции действует как переменная результата. Вы можете вернуть значение, присвоив его имени функции вместо использования Return. И все переменные инициализируются значениями по умолчанию, включая переменную имени функции. Это не относится к C, отсюда и другое значение предупреждения.

Сравните это с использованием переменных перед их инициализацией:

Dim x As Integer
CallFunction(x)  'No warning, x is implicitly and properly initialized to 0.

Dim y as Object
CallFunction(y)  'A warning: variable used before a value is assigned to it
6 голосов
/ 26 февраля 2010

Это часть базового языка. Все основные функции имеют тип возврата. Если вы не укажете тип возвращаемого значения, то предполагается, что типом является object .

Таким образом, компилятор не может предупредить вас о пропущенном возврате, потому что он не знает, преднамеренно ли вы пропустили возвращение или потому, что вы использовали функцию возврата по умолчанию в языке.

Из этого http://msdn.microsoft.com/en-us/library/sect4ck6(VS.80).aspx

если вы используете функцию выхода без назначения значения имени, процедура возвращает значение по умолчанию для типа данных, указанного в returntype. Если returntype не указан, процедура возвращает Nothing, значение по умолчанию для Object.

0 голосов
/ 15 сентября 2016

Я просто потратил семь часов на ту же проблему. В моем случае (с использованием Visual Studio 2012) компиляция завершилась с ошибкой компиляции:

Ошибка MSB3030: не удалось скопировать файл «Отладка obj \ x86 \ <имя цели сборки> .exe», так как файл не найден. (0, 0)

(текст был переведен с немецкого сообщения об ошибке, и я надеюсь, что он переведен правильно.)

Поскольку это сообщение не помогло, я вернул свой проект обратно в состояние, в котором он был скомпилирован, и, наконец, отследил его примерно до следующего:

Function SomeFunction() as Boolean
  If <somecondition> then 
    Exit Function
  end if
end function

Если я заменю функцию выхода на возвращаемое значение false или если я вставлю SomeFunction = false, ошибка компилятора не будет отображаться.

Так что да, как указано выше, Visual Basic должен по умолчанию возвращать значение, равное значению по умолчанию возвращаемого типа, но это каким-то образом приводило к сбою компиляции.

Я подозреваю, что это поведение трудно воспроизвести. Моя нижняя строка: установить возвращаемые значения явно. Код понятнее и может сэкономить семь часов на отладке.

0 голосов
/ 26 февраля 2010

Вы не обязательно запрашиваете обходной путь, но я просто обдумываю вслух: вы можете сделать тип возврата функции Nullable .

Во время выполнения, если функция ничего не отражает, вы знаете, что программист явно не присваивал возвращаемое значение. Конечно, это работает только для функций, которые, естественно, ничего не возвращают. И это неэффективно во многих отношениях.

0 голосов
/ 26 февраля 2010

Это похоже на ошибку для меня. Я могу воспроизвести его на моем конце в VS2008 SP1.

Интересно то, что он работает, если это ссылочный тип, но не работает, если это тип значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...