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;
}

- 派生クラスが に置き換えTられstringていたので、元のメッセージで示したようにベースを呼び出すことで、 を取るコンストラクターを呼び出しているとValue思いましたが、取るコンストラクターを呼び出していましたFormat...
- これを修正するには、私のStringFieldクラスで基本コンストラクターへの呼び出しを次のように置き換えました。

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

ジェネリックを使用しているときにタイプが競合する興味深いケース:)

4

1 に答える 1

1

コードをコピーして貼り付けましたが、テストは期待どおりに実行されます。コードは新しい NotImplementedException() をスローし、テストは Passed です。

おそらく、いくつかの古い dll:s を実行していますか? それとも、「throw new NotImplementedException()」の前のコードの一部が問題を引き起こしているのでしょうか? それらのコード行を投稿できますか?

于 2013-10-22T10:31:12.167 に答える