Nothing = String.Empty (Почему они равны?)
Почему первое утверждение if оценивается как истинное? Я знаю, что если я использую "is" вместо "=", это не будет иметь значение true. Если я заменю String.Empty на "Foo", это не будет иметь значение true. И String.Empty, и "Foo" имеют одинаковый тип String, так почему один из них имеет значение true, а другой - нет?
//this evaluates to true
If Nothing = String.Empty Then
End If
//this evaluates to false
If Nothing = "Foo" Then
End If
4 ответа
Ничто в VB.net не является значением по умолчанию для типа. Спецификация языка говорит в разделе 2.4.7:
Ничто не является особым буквальным; он не имеет типа и может быть преобразован во все типы в системе типов, включая параметры типов. При преобразовании в определенный тип он эквивалентен значению по умолчанию этого типа.
Таким образом, когда вы проверяете String.Empty, Nothing преобразуется в строку, имеющую длину 0. Оператор Is должен использоваться для проверки Nothing, а String.Empty.Equals(Nothing) также возвращает false.
Это особый случай VB =
а также <>
операторы.
Спецификация языка в разделе 11.14 гласит:
При сравнении строк пустая ссылка эквивалентна строковому литералу "".
В связи с этим, если вы используете строковую переменную, инициализированную "none", для присваивания свойству "value" SqlParameter, то этот параметр игнорируется, не включается в команду, отправляемую на сервер, и выдается ошибка отсутствующего параметра., Если вы инициализируете эту переменную с помощью string.empty, все будет хорошо.
//This doesn't work
Dim myString as String = nothing
mySqlCommand.Parameters.Add("@MyParameter", SqlDbType.Char).Value = myString
//This works
Dim myString as String = string.empty
mySqlCommand.Parameters.Add("@MyParameter", SqlDbType.Char).Value = myString
Попробуй это:
Console.WriteLine("Is String.Empty equal to Nothing?: {0}", String.Empty.Equals(Nothing))
=
оператор не применяет одинаковые типы, тогда как .Equals()
метод строкового объекта делает, как и Is
оператор.