Использование Double.NaN в необязательном параметре интерфейса

StackOverflow https://stackoverflow.com/questions/4696406

Вопрос

Я столкнулся с чем-то сбивающим с толку или потенциально ошибкой в 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" должен ...), нажимая клавишу возврата в конце строки "Реализует 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" отделено от "Double." префикса и подчеркнуто ("NaN" не объявлено.Он может быть недоступен из-за его уровня защиты.) Редактор кода снова вставил недопустимый код.

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

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

Это было полезно?

Решение

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

Вы можете сообщить об этом по адресу 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

Фу-у-у, это делает работает при использовании Double.Значение по умолчанию - Epsilon.Довольно глупый, но и не совсем необоснованный способ решения проблемы.Просто не позволяйте IDE генерировать реализацию, тогда это становится глупым.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top