如何设置属性设置器检查失效的默认值?

时间:2015-01-21 19:47:42

标签: c# exception argumentexception

我有两个具有匹配属性的字段,每个字段都在setter中进行数据验证。我希望默认值明显不正确。因此,我默认将它们初始化为'\0'-1

private char _zoneLetter = '\0';
private short _zoneNumber = -1;

这样,这些值可能存在的唯一方法是从未设置它们,因为我在setter中抛出异常。

public char ZoneLetter
{
    get { return _zoneLetter; }
    private set
    {
        if (!char.IsLetter(value)) throw new ArgumentException("No special characters are allowed.");
        _zoneLetter = value;
    }
}

public short ZoneNumber
{
    get { return _zoneNumber; }
    private set
    {
        if (!Enumerable.Range(1, 60).Contains(value)) throw new ArgumentException("Must be an integral value in the range [1,60].");
        this._zoneNumber = value;
    }
}

问题是,当我输入完全有效的数据时,仍会抛出异常,告诉我值'\0'不正确,即使在构造函数参数中输入了'a'

public UtmEvent(double unixTime, double easting, double northing, short zoneNumber, char zoneLetter)
    : base(unixTime)
{
    this.Easting = easting;
    this.Northing = northing;
    this.ZoneNumber = zoneNumber;
    this.ZoneLetter = ZoneLetter;
}

当我将默认值更改为有效的内容(例如'a'30)时,我的测试检查没有抛出任何异常。请告诉我我错过了什么。我是.Net的新手,不知道发生了什么事,哈哈。

2 个答案:

答案 0 :(得分:1)

您有大写错误

this.ZoneLetter = ZoneLetter;

应该是

this.ZoneLetter = zoneLetter;

答案 1 :(得分:0)

我的眼睛错过了构造函数中的this.ZoneLetter = ZoneLetter;行。我试图将属性分配给自己,导致getter获取默认值'\0'并将其反馈到setter的验证条件。这是一个教训,表明不选择糟糕的参数名称的重要性。 Note to self: should not be the exact same as property or field names, with only the capitalization differing.

哦,羞辱。