【问题标题】:VB.NET unable to differentiate between overloaded functionsVB.NET 无法区分重载函数
【发布时间】:2016-04-19 16:22:40
【问题描述】:

当前版本的 MVVM Light 在 ObservableObject 类中有一个名为 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

现在,如果您有一个 String 类型属性,VB.NET 无法区分我们调用的是哪个重载。

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

'受保护的重载函数 [Set](Of String)(propertyName As String, ByRef field As String, newValue As String) As Boolean':不是最具体的。

'受保护的重载函数 [Set](Of String)(ByRef field As String, newValue As String, [propertyName As String = Nothing]) As Boolean':不是最具体的。

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

【问题讨论】:

  • 一种解决方法可能是创建自己的结构,在其中覆盖运算符以匹配私有 String 字段。

标签: vb.net mvvm overloading mvvm-light


【解决方案1】:

将近一年后又来了。我刚刚找到了一个在大多数情况下都可以使用的解决方法。不要调用问题中提到的重载之一,而是使用第三个重载:

Protected Function [Set](Of T)(ByRef field As T, newValue As T, <CallerMemberName> Optional propertyName As String = Nothing) As Boolean

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

【讨论】:

    猜你喜欢
    • 2015-08-04
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    相关资源
    最近更新 更多