Почему нельзя определить тип get и установить тип в свойствах? - PullRequest
0 голосов
/ 31 августа 2011

Вот проблема, я хотел определить свойство, которое принимает decimal числа и выполнить какой-то процесс со значением и вернуть string, как показано ниже:

Public Property Amount() As String
    Get
        Return Utility.PaddingRight(Me.msAmount.ToString(), 10)
    End Get
    Set(ByVal vsValue As Decimal)
        Me.msAmount = vsValue
    End Set
End Property

Но компиляторы предупреждают "У заданных параметров должен быть тот же тип свойства, в котором они содержатся. "

Не похоже, что это должно выдать ошибку, так как выглядит корректно.

Ответы [ 4 ]

3 голосов
/ 31 августа 2011

Причина, по которой вы не можете этого сделать, заключается в том, что то, что вы вкладываете в свойство, должно быть точно таким же, как то, что вы получаете от него. Если тип изменился, то это условие никогда не будет выполнено. Спецификация Microsoft гласит, что «Свойства подобны интеллектуальным полям». Представьте, что поле (переменная класса) изменилось между чтением и записью.

Ваша цель полностью действительна, но она не предназначена для использования свойств. (Под «намеченной целью» я подразумеваю намеченную цель Microsoft.) Ваш дизайн также открыл бы двери для потенциальных проблем, если бы была передана недопустимая или нулевая строка. Одна из целей разработки свойств заключается в том, что они имеют малый вес и не должны выбрасывать ошибки. Они могут , но не должны . Рекомендуемое решение - использовать шаблон TryParse для вашей собственности.

EDIT

Извините, мой мозг отвлекся, ваша цель - сменить геттер, а не сеттер. Шаблон, который вы ищете, это просто свойство только для чтения (как указывал @msarchet), специфичное для вашего геттера. Например, AmountForPrint или что-то. Вы также должны включить чтение / запись для вашего фактического значения.

Public ReadOnly Property AmountForPrint
    Get
        Return Me.Amount.ToString()
    End Get
End Property
Public Property Amount As Integer
    Get

    End Get
    Set(value As Integer)

    End Set
End Property
1 голос
/ 31 августа 2011

Я думаю, вам нужно сделать это с помощью метода, а не свойства

Public Function Amount(ByVal value As Decimal) As String

End Function
0 голосов
/ 31 августа 2011

Тебе было бы гораздо лучше сделать это как таковое

Public Read Only Property Amount() As String
    Get
         Return Utility.PaddingRight(Me.msAmount.ToString(), 10)
    End Get
End Property

Public Sub SetAmount(ByVal value As Decimal)
    Me.msAmount = value
End Sub
0 голосов
/ 31 августа 2011

Это просто выстрел в темноте.,,

Set(ByVal vsValue As String)
    Me.msAmount = System.Convert.ToDecimal(vsValue)
End Set
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...