0

我有一个这样的抽象类:

public abstract class Field<T>
{
    private int _length;
    public int Length
    {
        get
        {
            return _length;
        }
        protected set
        {
            if (value <= 0)
            {
                throw new ArgumentOutOfRangeException("The length must be greater than 0");
            }
            else
            {
                _length = value;
            }
        }
    }

    private T _value;
    public T Value 
    {
        get
        {
            if (_value == null) throw new ArgumentException("Field does not have any value set");
            return _value;
        }
        set
        {
            //here obviously I have some code to check the value and assign it to _value
            //I removed it though to show what the problem is

            throw new NotImplementedException();
        }
    }

    public Field(int length, T value)
    {
        Length = length;
        Value = value;
    }

    public Field(int length)
    {
        Length = length;
    }

    //some abstract methods irrelevant to the question...
}

然后我有一个继承 Field<> 的类

public class StringField : Field<string>
{
    public StringField(int length, string value)
        : base(length, value)
    { }

    public StringField(int length)
        : base(length)
    { }

    //implementation of some abstract methods irrelevant to the question...
}

当我运行这样的测试时,它很好并且通过了(构造函数抛出一个正确的异常):

[TestMethod]
[ExpectedException(typeof(ArgumentOutOfRangeException))]
public void Constructor_LengthOnly_LengthZero_ShouldThrowArgumentOutOfRangeException()
{
    int length = 0;
    StringField sf = new StringField(length);

    //should throw exception
}

但是当我运行这个测试时,构造函数不会抛出,即使它应该抛出 NotImplementedException:

[TestMethod]
[ExpectedException(typeof(NotImplementedException))]
public void Constructor_LengthAndValue_ValidLength_TextTooLong_ShouldThrowNotImplementedException()
{
    int length = 2;
    string value = "test";

    StringField sf = new StringField(length, value);

    //should throw exception
}

难道我做错了什么?我不认为我错过了什么,是吗?谢谢。

- 编辑 -

原来一切都很好,这里发生了什么:
- 在Field我有另一个属性和构造函数,如下所示:

enprivate string _format;
public string Format 
{ 
    get 
    { 
        return _format; 
    }
    protected set
    {
        _format = value;
     }
}

public Field(int length, string format)
{
    Length = length;
    Format = format;
}

- 由于派生类被替换Tstring,我认为通过像我在原始消息中显示的那样调用基类,我正在调用采用的构造函数Value,但我正在调用一个采用Format...
- 在我的StringField班级中解决这个问题我替换了对基本构造函数的调用,如下所示:

public StringField(int length, string value)
    : base(length, value: value)
{ }

使用泛型时类型冲突的一个有趣案例 :)

4

1 回答 1

1

我复制粘贴的代码,对我来说,测试按预期执行:代码抛出一个新的 NotImplementedException() 并且测试通过。

也许您正在执行一些旧的 dll:s?或者“throw new NotImplementedException()”之前的某些代码导致了问题?您可以发布这些代码行吗?

于 2013-10-22T10:31:12.167 回答