Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将VB.NET变量设置为C#';s空_C#_Vb.net_Null_Nothing - Fatal编程技术网

将VB.NET变量设置为C#';s空

将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(

根据

表示数据类型的默认值

还注意到,“…the
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()
    表示运算符“.”不能应用于类型为“的操作数
  • await(null)
    将不被c#允许,它表示
    不能等待null
事实证明,由于我在C#code中将
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
    }
}