C#到VB.Net通用委托错误

C#到VB.Net通用委托错误,c#,vb.net,generics,delegates,C#,Vb.net,Generics,Delegates,首先,对标题感到抱歉,我不太确定该放什么 背景 需要对服务调用各种方法,但服务要求我们在每次操作调用之前登录,然后再次注销 因此,与其每次手动打3个电话,不如使用泛型 代码和问题 在C中# 编写了一个ServiceCaller类 public class ServiceCaller<T> { private T instance; public ServiceCaller(T param) { this.instance = param;

首先,对标题感到抱歉,我不太确定该放什么

背景 需要对服务调用各种方法,但服务要求我们在每次操作调用之前登录,然后再次注销

因此,与其每次手动打3个电话,不如使用泛型

代码和问题

在C中# 编写了一个ServiceCaller类

public class ServiceCaller<T>
{
    private T instance;

    public ServiceCaller(T param)
    {
        this.instance = param;
    }

    public void Call<U>(Func<T, U> aExpression, Action<U> returnClass)
    {
        Authentication authenticate = new Authentication();
        if (authenticate.Login())
        {
            U result = aExpression(this.instance);
            returnClass(result);
        }
    }
}
而网页背后的代码确实如此

var serviceWrapper = new ServiceTest.ServiceCaller<ServiceTest.MFMPlanActions> 
    (new ServiceTest.MFMPlanActions());
serviceWrapper.Call(x => x.GetPromotionPlans(plan), u => Console.WriteLine(u)); 
在线

serviceWrapper.[Call](Function(x) x.GetPromotionPlans(plan), Function(u) Console.WriteLine(u))
我得到:对象引用未设置为对象的实例

我对VB.net不够熟悉,不知道哪里出了问题


有人能帮忙吗?

我认为这段代码中没有,但vb项目中可能缺少一个参考。并且您没有在方法调用中返回设置returnClass


尝试将else语句中的returnClass设置为anything,以查看错误是否消失,然后我们可以从那里开始

您可能希望将
Dim serviceWrapper设置为New
而不是
Dim serviceWrapper=New


VB.NET通常比C#更显式,尤其是使用
选项推断关闭
,以及
选项严格打开
。尝试在源文件的顶部设置这些。开始向语句显式添加类型,查看错误何时消失。在应用代码的其他部分后,您还可能会注意到这些问题。但是,修复它们可以帮助您避免运行时出现问题。

在vb.net中,returnclass的内容被注释掉了您确定
ServiceTest.ServiceCaller
API.ServiceCaller
相同吗?这是我能看到的唯一区别。另外,您可能希望
Dim serviceWrapper作为新的
,而不是那里的
Dim serviceWrapper=New
。这里不应该做交易,只是VB.NET.Hi中的一个声明标准。是的,它们是相同的,只是为了实际项目而重命名,以便更好地命名:)好的,有趣的是,我将Dim serviceWrapper=更改为Dim serviceWrapper作为新的,并且我在下面一行中得到了以下错误,即方法“Public Sub Call”中类型参数的数据类型无法从这些参数推断出(Of U)(aExpression As System.Func(Of T,U))。请指定数据类型显式可能会更正此错误。VB.NET通常比C#更显式,尤其是在
选项推断关闭
选项严格打开
的情况下。请尝试在源文件顶部设置这些选项。开始显式向语句添加类型,查看错误何时消失。您可能还会注意到代码其他部分的问题在你应用它们之后。但是,修复它们应该可以帮助你避免在运行时出现问题。Neolik-你是一个明星!将=更改为As,然后对错误进行排序,这样就可以了!我不能将此标记为答案,所以将其全部放在下面Hanks将=更改为New,并对所有返回值内容进行了注释,以消除错误,这样就可以了。谢谢你ou@user1466569:谢谢您接受。您也可以对任何您认为有用的答案进行投票。只能接受一个答案,但是,一个问题上可以对多个答案进行投票。请参阅。在这方面有另一个快速问题…我的最后一行现在看起来像这样,非常适合serviceWrapper.Call(函数(x)x.GetPromotionPlans(req),函数(u)u)…但是我需要将返回数据(以u为单位)分配给一个局部变量,这样我就可以使用…我该怎么做?@user1466569:你是指这个
函数(x)x.GetPromotionPlans(req)
?没有u是从函数调用返回的数据,我需要这个数据
Dim serviceWrapper = New API.ServiceCaller(Of API.MFMPlanActions)(New API.MFMPlanActions())
serviceWrapper.[Call](Function(x) x.GetPromotionPlans(plan), Function(u) Console.WriteLine(u))
serviceWrapper.[Call](Function(x) x.GetPromotionPlans(plan), Function(u) Console.WriteLine(u))