На самом деле, что такое Ничто - как это преобразуется

У меня есть библиотека классов VB с тестовым методом. Что вернет целое число (иногда будет возвращено Nothing).

Public Class Class1
    Public Function testMethod() As Integer
        'Some code here
        Return Nothing
    End Function
End Class 

Если я вызываю метод в проекте VB, все работает отлично, как и ожидалось. Например:

  Dim output As String = testMethod().ToString() ' Works fine and output =""

Но когда я вызываю метод, создавая объект в приложении C#, он выдает ошибку как null, когда возвращаемое значение равно Nothing.

VBTestLib.Class1 classObject = new VBTestLib.Class1();
string objectStringValue = classObject.testMethod().ToString(); // Error

Это означает, что Nothing будет преобразовано в null (null.ToString() не разрешено). Теперь рассмотрим следующий пример:

 int objectIntValue = classObject.testMethod(); // objectIntValue = 0

Здесь Nothing будет преобразовано в значение по умолчанию для int (0). Я расширил тестирование, используя dynamic, тогда также назначено значение 0. то есть,

 dynamic objectDynamicValue = classObject.testMethod();// objectDynamicValue = 0

Итак, мой вопрос: что такое Nothing? Как он будет преобразован при присвоении типу C#? Или я должен сделать вывод, что:

Если метод VB возвращает Nothing и значение присваивается переменной C# типа значения, тогда будет назначено значение по умолчанию типа возвращаемого значения метода. И если он назначен переменной ссылочного типа, то будет присвоено null.


person Suji    schedule 22.06.2016    source источник
comment
Вы ответили на свой вопрос...   -  person M.kazem Akhgary    schedule 22.06.2016
comment
В вашем примере что-то не так - testMethod().ToString() равно 0 в VB, а не пустой строке.   -  person Dave Doknjas    schedule 22.06.2016
comment
Ваш вывод верен независимо от того, вызывается ли метод VB из VB или C #.   -  person Dave Doknjas    schedule 22.06.2016
comment
Ничего (Visual Basic)   -  person shadow    schedule 22.06.2016
comment
Типы значений (по сути, примитивы и структуры) не могут быть Nothing, поэтому вместо этого они устанавливаются в значение по умолчанию для типа. Ссылочные типы на самом деле могут быть Nothing.   -  person Cody Gray    schedule 22.06.2016


Ответы (1)


Как я уже упоминал в вопросе (я тоже предполагал), Nothing представляет значение по умолчанию любого типа данных (C# default(T)). Для ссылочных типов значением по умолчанию является нулевая ссылка. Для типов значений значение по умолчанию зависит от того, допускает ли тип значения значение NULL.

Здесь, в моем коде VB, возвращаемое значение метода - Integer (тип значения). Таким образом, ничто не будет его значением по умолчанию 0. Вот почему 0 присваивается и динамическому типу. Но это не альтернатива null или не эквивалентно null.

person Suji    schedule 22.06.2016