在c#中将函数作为参数传递但不在vb.net中进行调整?

时间:2017-07-06 16:51:43

标签: vb.net

所以我在c#中有以下代码行来注册AutoMapper和SimpleInjector:

container.Register(() => config.CreateMapper(container.GetInstance));

对于上下文,config.CreateMapper()看起来像这样:

public IMapper CreateMapper(Func<Type, object> serviceCtor);

虽然container.GetInstance看起来像这样:

public object GetInstance(Type serviceType);

我发布的第一行代码在C#中工作,因为config.CreateMapper接受一个Type类型的函数,并返回object类型。正是container.GetInstance的作用。

当我尝试在VB中执行相同的行时,如:

container.Register(Function() config.CreateMapper(container.GetInstance))

它出错Type arguments for 'Public Function Container.GetInstance(Of TService)()' cannot be inferred from the usage. Try specifying type arguments explicitly。它给出了这个错误,因为container.GetInstance有一个看起来像这样的重载:

public TService GetInstance<TService>() where TService : class;

为什么VB尝试使用GetInstance的错误重载,如何强制它使用正确的重载?

2 个答案:

答案 0 :(得分:1)

使用AddressOf获取功能参考。

container.Register(Function() config.CreateMapper(AddressOf container.GetInstance))

在带有括号的C#函数中执行它,没有括号的函数将返回对函数的引用。

在VB.NET中,函数中的括号是可选的 - 无论如何都将执行函数。因此,对于引用函数,您应该使用AddressOf运算符 AddressOf Operator

答案 1 :(得分:0)

在函数参数前使用AddressOf关键字将其定义为参数作为函数指针。

AddressOf与C#中的@关键字相同。关键字隐含在c#示例中使用。