2011-01-14 4 views
1

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

Следующий код подчеркивает «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» указывается (Class «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» был отделен от «Двойной». префикс и подчеркнутый («NaN» не объявлен, он может быть недоступен из-за его уровня защиты.) Редактор кода снова вставил неверный код.

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

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

ответ

1

тьфу, это Fugly. Трудно охарактеризовать это как нечто, кроме ошибки. Форматирование по умолчанию для 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 

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

+0

Спасибо Хансу, я обнаружил, что Positive и NegativeInfinity работают также, хотя, как вы говорите, нет, если IDE выполняет задачу. Мне все еще интересно узнать, существует ли какой-либо синтаксис, правильный для NaN, или, более просто, если исходный синтаксис верен, а IDE просто ложно идентифицировала ошибку. –

+0

Double.NaN - правильный синтаксис. Это просто не работает из-за недостатка в компиляторе. Это почти наверняка вызвано нечетным поведением NaN: Double.NaN! = Double.NaN. В компиляторе им понадобится специальный случай. Нечетное поведение среды IDE является отдельной проблемой. –