Использование Double.NaN в необязательном параметре интерфейса - PullRequest
1 голос
/ 15 января 2011

Я столкнулся с чем-то непонятным или, возможно, с ошибкой в ​​Visual Studio 2010 при определении интерфейса в моем приложении VB: при определении метода интерфейса с параметром по умолчанию типа Double использование константы Double.NaN в качестве значения по умолчанию вызывает редактор кода / intellisense / прекомпилятор некоторые проблемы.

Следующий код подчеркивает «INaNTest» и «INaNTest.DoSomething», утверждая, что «DoSomething» не может реализовать «DoSomething», потому что в интерфейсе «INaNTest» нет соответствующего подпрограммы:

Public Class NaNTest
    Implements INaNTest
    Public Sub DoSomething(ByVal x As Double,
                           Optional ByVal a As Double = Double.NaN)
                           Implements INaNTest.DoSomething
    End Sub
End Class

Public Interface INaNTest
    Sub DoSomething(ByVal x As Double,
                    Optional ByVal a As Double = Double.NaN)
End Interface

Удаление реализации и начиная с:

Public Class NaNTest
    Implements INaNTest
End Class

Public Interface INaNTest
    Sub DoSomething(ByVal x As Double,
                    Optional ByVal a As Double = Double.NaN)
End Interface

, где теперь "NaNTest" подчеркнут (класс "NaNTest" должен ...), нажатие клавиши возврата в конце строки "Implements INaNTest" (т.е. автоматически вставляет реализацию) добавляет реализацию:

    Public Sub DoSomething(ByVal x As Double,
                           Optional ByVal a As Double = -1.#IND)
                           Implements INaNTest.DoSomething

    End Sub

, в котором редактор кода затем подчеркивает «#» (ожидается идентификатор). Таким образом, код автоматически добавляет код, который не является правильным.

В качестве альтернативы теперь, начиная с приведенного выше исходного кода, используя кнопку «Параметры исправления ошибок» на подчеркнутом «INaNTest.DoSomething» и выбирая «Создать заглушку метода для« DoSomething »в« INaNTest », добавленная заглушка метода: *

    Sub DoSomething(ByVal x As Double,
                    Optional ByVal a As Double = NaN)

где теперь «NaN» оторван от «Двойника». префикс и подчеркнутый («NaN» не объявлен. Может быть недоступен из-за уровня защиты.) Редактор кода снова вставил неверный код.

Есть ли правильное решение использовать Double.NaN в качестве значения по умолчанию для метода, определенного в интерфейсе в VB.net, или есть фундаментальная причина, почему это невозможно?

Большое спасибо, JCollins

1 Ответ

1 голос
/ 15 января 2011

Тьфу, это плохо.Трудно охарактеризовать это как что-либо, кроме ошибки.Форматирование по умолчанию для NaN, когда вы разрешаете IDE генерировать сигнатуру метода, показывает, какой язык использует команда VB.NET, то есть способ, которым библиотека времени выполнения C ++ форматирует NaN.Попытки убедить вас в том, что вы знаете, что вы делаете, на самом деле бесполезны, на самом деле.

Вы можете сообщить об этом на connect.microsoft.com.Пока вы ждете «исправлено в следующей версии Visual Studio», чтобы увидеть свет, вы можете рассмотреть возможность использования обнуляемых типов в качестве обходного пути:

Public Class NaNTest
    Implements INaNTest
    Public Sub DoSomething(ByVal x As Double, Optional ByVal a As Double? = Nothing) Implements INaNTest.DoSomething
        If a.HasValue Then
            '' etc..
        End If
    End Sub
End Class

Public Interface INaNTest
    Sub DoSomething(ByVal x As Double,
                    Optional ByVal a As Double? = Nothing)
End Interface

Fwiw, это делает работать, когда вы используете Double.Epsilon в качестве значения по умолчанию.Вроде глупый, но не совсем необоснованный обходной путь.Только не позволяйте IDE генерировать реализацию, тогда это глупо.

...