将VB.NET变量设置为C#';s空
根据 无表示数据类型的默认值 还注意到,“…the将VB.NET变量设置为C#';s空,c#,vb.net,null,nothing,C#,Vb.net,Null,Nothing,根据 无表示数据类型的默认值 还注意到,“…theNothing关键字实际上相当于C#的关键字” 这给了我一个多语言解决方案中的一些异常行为,我最近一直在工作。具体地说,当VB.NET异步方法返回Nothing时,在C#end抛出了多个targetingExceptions 是否可以将VB.NET项目中的变量设置为C#的null,并能够在C#和VB.NET中测试该null值 下面是一个行为不符合预期的代码段。C#项目导入VB.NET项目作为参考 VB.NET端 公共函数DoSomething(
Nothing
关键字实际上相当于C#的关键字”
这给了我一个多语言解决方案中的一些异常行为,我最近一直在工作。具体地说,当VB.NET异步方法返回Nothing
时,在C#end抛出了多个targetingException
s
是否可以将VB.NET项目中的变量设置为C#的null
,并能够在C#和VB.NET中测试该null
值
下面是一个行为不符合预期的代码段。C#项目导入VB.NET项目作为参考 VB.NET端
公共函数DoSomething()作为任务(对象的)
Dim tcs=新任务完成源(对象的)
Dim params=Tuple.Create(“参数”,tcs)
AnotherMethod(参数)
返回tcs.Task
端函数
Public Sub-AnotherMethod(参数为元组(字符串的),TaskCompletionSource(对象的))
"做一些活动,
如果result=“Success”,则
params.Item2.SetResult(“我们成功了”)的结果也可以是不同的类型
其他的
params.Item2.SetResult(Nothing)”这可能是异常的来源吗?
如果结束
端接头
C#Side
public异步void waitingsomething1()
{
var结果=”;
result=(wait DoSomething()).ToString();//如果结果为空,则失败
}
公共异步void waitingsomething2()
{
var结果=”;
result=(string)(wait DoSomething());//如果结果为Nothing,则失败
}
公共异步void waitingsomething3()
{
var任务=DoSomething();
等待任务;//如果结果为Nothing,也会失败
}
当VB.NET的AnotherMethod
成功时,不会引发异常。但是,当它不成功并且tcs
的结果设置为Nothing
时,一切都落在它的头上
我怎样才能有效地
SetResult
到Nothing
而不导致异常,或者,我怎样才能SetResult
到C#的null
?这并不是因为从Nothing
到null
的转换。这里我有一些例子,C#接受Nothing
作为空
:
Vb类库代码:
Public Class ClassVb
Public Function Dosomething() As Task(Of Object)
Return Nothing
End Function
End Class
调用此类库的C#:
using vbclassLib;
class Program
{
static void Main(string[] args)
{
ClassVb classLibObj = new ClassVb();
var result = classLibObj.Dosomething();//result=null
}
}
它工作正常,并给出result=null
,即,没有任何内容转换为null
让我来谈谈你的情况:
在您的场景中,当函数返回Nothing
时,它肯定会转换为null
,但是。ToString()
方法或await()
无法处理null
,这就是您获得异常的原因
或null.ToString()
表示运算符“.”不能应用于类型为“的操作数(null).ToString()
将不被await(null)
允许,它表示c#
不能等待null
ClassVb classLibObj = new ClassVb();
var temp = classLibObj.Dosomething();
var result = temp == null ? "" : temp.ToString();
我看到了一个相关问题的解决方法,即让VB项目将“Nothing”强制转换为“Object”类型,以确保它是对应于引用类型(例如C#null)的默认值,并由C#项目接收,而不是某个值类型的默认值(例如,整数类型为0):
在阅读了un lucky的文章后,我的错误变得显而易见:
或null.ToString()
表示运算符“.”不能应用于类型为“的操作数(null).ToString()
将不被c#允许,它表示await(null)
不能等待null
result
变量设置为string
,因此无法从Object
(如VB.NET的Task(of Object)
返回类型)转换,而无需执行.ToString()
或(string)(wait Method())
。使用这两个过程中的任何一个都会导致出现NullReferenceException
我终于能够找出我做错了什么,首先将返回的任务
分配给一个变量,然后在等待后检查其结果是否为null
。因此,我完成了这样符合我目的的代码
public class CSharpClass
{
public async void AwaitSomething()
{
var task = new VbNetClass().DoSomething();
await task;
// test task.Result for null
var result = (task.Result ?? "method was unsuccessful").ToString();
// rest of code follows
}
}
感谢并感谢他们的贡献。熬夜超过20个小时,我太累了,以至于没有注意到他们的观点。但让我感到震惊的是,为什么我使用了
TargetInvokationException
而不是NullReferenceException
,我可能是错的,但从c方面看,你似乎试图将空值传递给e.ToString()
这可能会导致抛出“空值”错误,请另外给我们一个erorr,您得到的“落在它的头上”信息不如“system.Which在期望Y时返回X值”什么是异常的InnerException
?获取的异常是一个TargetInvocationException
,消息为“mscorlib.dll中发生了类型为'System.Reflection.TargetInvocationException'的第一次机会异常”.Visual Studio显示“源不可用”页面,并且也没有可用的堆栈跟踪。您的第三个示例对我来说没有意义。即使结果值为null,wait task;
也没有理由失败。DoSomething()
方法总是返回一个非空对象,因此任务本身总是非空的,因此等待任务
应该总是有效的。结果是空的,但在第三个示例中,您永远不用麻烦使用它,所以它为空不是一个好方法
public class CSharpClass
{
public async void AwaitSomething()
{
var task = new VbNetClass().DoSomething();
await task;
// test task.Result for null
var result = (task.Result ?? "method was unsuccessful").ToString();
// rest of code follows
}
}