2016-04-19 3 views
2

Текущая версия MVVM Light имеет вспомогательную функцию с именем Set в классе ObservableObject, которую наследующий класс ViewModel может вызывать как изменение значения свойства, так и подмена уведомления об изменении в один вызов. Вместе с новым оператором NameOf это делает код шаблонов свойств намного меньше.VB.NET не может различать перегруженные функции

Однако проблема в том, что функция 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) (ИмениСвойства As String, ByRef поле As String, NEWVALUE As String) As Boolean ': Не самый конкретный.

Функция защищенных перегрузок [Set] (Of String) (поле ByRef As String, newValue As String, [propertyName As String = Nothing]) As Boolean ': Не более конкретно.

Обратите внимание, что C# может легко справиться с этой ситуацией, используя ключевое слово ref. Кроме того, хотя текущая ситуация связана с MVVM Light, сама проблема является общей. Я также пытался использовать именованные параметры, но это тоже не помогает. Любые намеки на то, как это можно решить?

+0

Обходным решением может быть создание вашей собственной структуры, где вы переопределяете операторы, чтобы они соответствовали частному полю 'String'. –

ответ

1

Здесь снова после почти года. Я только что нашел небольшое обходное решение, которое будет работать в большинстве случаев. Вместо того, чтобы позвонить по одному из перегруженных упомянутых в вопросе, используйте третью перегрузку:

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

Третий параметр этой перегрузки является необязательным, и если вы пропустите его в вызове, он будет использовать CallerMemberName присвоить ему значение , Поскольку Set почти всегда вызывается из свойства, этот подход должен работать хорошо. Никакая другая перегрузка не принимает два параметра, поэтому компилятор может ее правильно решить.