为什么不能在Properties中明确定义get类型和set类型?

时间:2011-08-31 17:32:00

标签: vb.net properties

这是问题,我想定义一个接受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

但是编译器警告“Set参数必须具有相同类型的包含属性。”

它看起来不应该抛出错误,因为它看似合法。

4 个答案:

答案 0 :(得分:3)

你不能这样做的原因是因为你放入一个属性的内容应该与你从中获得的内容完全相同。如果类型改变了,那么这种情况永远不会成立。 Microsoft's spec说“属性就像智能领域”。想象一下,如果一个字段(类变量)在读写之间发生了变化。

您的目标完全有效,但这不是属性的预期用途。 (“预期目标”是指微软的预期目标。)如果传入无效或空字符串,您的设计也会为潜在问题打开大门。属性的设计目标之一是它们重量轻且不应该扔错误。他们 可以 不应 。建议的解决方案是为您的财产使用TryParse模式。

修改

抱歉,我的大脑偏离了轨道,你的目标是改变吸气剂,而不是改变吸气剂。您正在寻找的模式只是一个只读属性(如@msarchet指出的那样),它特定于您的getter。例如,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 :(得分:1)

我认为您需要使用方法而不是属性来执行此操作

Public Function Amount(ByVal value As Decimal) As String

End Function

答案 2 :(得分:0)

这只是在黑暗中拍摄的。 。 。

Set(ByVal vsValue As String)
    Me.msAmount = System.Convert.ToDecimal(vsValue)
End Set

答案 3 :(得分:0)

你这样做会好得多吗

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