VB.NET无法区分重载函数

VB.NET无法区分重载函数,vb.net,mvvm,overloading,mvvm-light,Vb.net,Mvvm,Overloading,Mvvm Light,当前版本的MVVM Light在observeObject类中有一个名为Set的助手函数,继承的ViewModel类可以在一次调用中调用该函数来更改属性值并发出更改通知。再加上新的NameOf操作符,这使得属性的样板代码小得多 但是问题是,Set函数重载,在3个重载中,以下2个重载使VB.NET生气: Protected Function [Set](Of T)(propertyName As String, ByRef field As T, newValue As T) As Boolean

当前版本的MVVM Light在
observeObject
类中有一个名为
Set
的助手函数,继承的ViewModel类可以在一次调用中调用该函数来更改属性值并发出更改通知。再加上新的
NameOf
操作符,这使得属性的样板代码小得多

但是问题是,
Set
函数重载,在3个重载中,以下2个重载使VB.NET生气:

Protected Function [Set](Of T)(propertyName As String, ByRef field As T, newValue As T) As Boolean
Protected Function [Set](Of T)(ByRef field As T, newValue As T, <CallerMemberName> Optional propertyName As String = Nothing) As Boolean
protectedfunction[Set](共T个)(propertyName为字符串,ByRef字段为T,newValue为T)为布尔值
受保护函数[Set](共T个)(ByRef字段为T,newValue为T,可选propertyName为String=Nothing)为布尔值
现在,如果您有一个
String
type属性,那么VB.NET无法区分我们调用的重载

重载解析失败,因为没有可访问的“[Set]”最适合这些参数:

“受保护的重载函数[集](字符串)(propertyName为字符串,ByRef字段为字符串,newValue为字符串)为布尔值”:不是最具体的

“受保护的重载函数[Set](字符串的)(ByRef字段作为字符串,newValue作为字符串,[propertyName作为字符串=Nothing])作为布尔值”:不是最具体的


请注意,通过使用
ref
关键字,C#可以轻松处理这种情况。此外,即使当前的情况与MVVM Light有关,问题本身也是一般性的。我也尝试过使用命名参数,但也没有用。关于如何解决这一问题,有什么提示吗?

差不多一年后,再次出现在这里。我只是找到了一个在大多数情况下都有效的解决办法。使用第三个重载,而不是调用问题中提到的其中一个重载:

Protected Function [Set](Of T)(ByRef field As T, newValue As T, <CallerMemberName> Optional propertyName As String = Nothing) As Boolean
protectedfunction[Set](共T个)(ByRef字段为T,newValue为T,可选propertyName为String=Nothing)为布尔值

此重载的第三个参数是可选的,如果在调用中跳过它,它将使用
CallerMemberName
为其赋值。由于
Set
几乎总是从属性内部调用,因此这种方法应该可以很好地工作。没有其他重载需要两个参数,所以编译器可以正确地解析它。

一种解决方法是创建自己的结构,在其中重写运算符以匹配私有
字符串
字段。