Никакое предупреждение в VB.NET, когда функция не имеет никакого возврата

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

Один из них был тем, что компилятор не предупредил, если Вы объявили Функцию, но никогда не делали явный Оператор возврата или присваиваете Имени функции. Запуская 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 () Функция. Это походит на великолепное место для помещения предупреждения, потому что оно примет значение по умолчанию ко Лжи, и Вы, возможно, просто забыли делать возврат. 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 (который является значением по умолчанию для булевской переменной), таким образом, это вероятно скрытая ошибка, которую я должен был возвратить True в Else.

6
задан Community 23 May 2017 в 12:06
поделиться

4 ответа

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

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

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

Это происходит потому, что имя функции внутри этой самой функции действует как переменная результата. Вы можете вернуть значение, присвоив его имени функции вместо использования Return. При этом все переменные инициализируются значениями по умолчанию, включая переменную function-name. Это не так в 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
8
ответ дан 8 December 2019 в 17:21
поделиться

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

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

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

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

6
ответ дан 8 December 2019 в 17:21
поделиться

Мне это кажется ошибкой. Я могу воспроизвести его на своем конце в VS2008 SP1.

Что интересно, это ДЕЙСТВИТЕЛЬНО работает, если это ссылочный тип, но не работает, если это тип значения.

0
ответ дан 8 December 2019 в 17:21
поделиться

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

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

0
ответ дан 8 December 2019 в 17:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: