С # Согласно MSDN entry for Nothing (Visual Basic)Установить переменную VB.NET в нуль
В настоящее представляет значение по умолчанию для типа данных.
Также был отмечен some, что»... Nothing
ключевого слова фактически эквивалентно С # default(T)
ключевым слова».
Это дало мне некоторое аномальное поведение в многоязычном решении, над которым я работал недавно. В частности, я получаю больше, чем несколько TargetInvocationException
s, которые бросаются на конец C#, когда методы async VB.NET возвращают Nothing
.
Возможно ли установить переменную в проектах VB.NET на C# null
и иметь возможность протестировать это значение null
как на C#, так и на VB.NET.
Вот фрагмент, который не ведет себя так, как ожидалось. Проект C# импортирует проект VB.NET в качестве ссылки.
VB.NET Side
Public Function DoSomething() As Task(Of Object)
Dim tcs = New TaskCompletionSource(Of Object)
Dim params = Tuple.Create("parameters", tcs)
AnotherMethod(params)
Return tcs.Task
End Function
Public Sub AnotherMethod(params As Tuple(Of String, TaskCompletionSource(Of Object))
' do some activities
If result = "Success" Then
params.Item2.SetResult("we were successful") ' result can also be of different type
Else
params.Item2.SetResult(Nothing) ' could this be the source of the exception?
End If
End Sub
C# Side
public async void AwaitSomething1()
{
var result = "";
result = (await DoSomething()).ToString(); // fails if Result is Nothing
}
public async void AwaitSomething2()
{
var result = "";
result = (string)(await DoSomething()); // fails if Result is Nothing
}
public async void AwaitSomething3()
{
var task = DoSomething();
await task; // also fails if Result is Nothing
}
Там не исключение выбрасывается при VB.Net в AnotherMethod
успешно. Однако, когда это не удастся, и результат tcs
- Nothing
, все падает на его голову.
Как эффективно SetResult
к Nothing
, не приводя к исключению или, в противном случае, как я могу SetResult
на С # null
?
Вы имеете в виду, что вы получаете исключение в вызове 'ToString()', потому что возвращаемое значение 'await DoSomething()' равно null? –
Я мог ошибаться, но на стороне C# это похоже на то, что вы пытаетесь передать нулевое значение в '.ToString()' Который может привести к ошибке «null value», альтернативно дать нам erorr, падает на его голову "не так информативно, как" system.whatever возвращал значение X, когда он ожидал Y " – Nikerym
Какое исключение' InnerException'? – Will