12

私は2つの拡張方法を持っています:

public static IPropertyAssertions<T> ShouldHave<T>(this T subject)
{
    return new PropertyAssertions<T>(subject);
}

public static IPropertyAssertions<T> ShouldHave<T>(this IEnumerable<T> subject)
{
    return new CollectionPropertyAssertions<T>(subject);
}

今、私はそれを使用するいくつかのコードを書きます:

List<Customer> collection2 = new List<Customer>(); 
collection2.ShouldHave(); //first overload is chosen
IEnumerable<Customer> collection3 = new List<Customer>(); 
collection3.ShouldHave(); //second overload is chosen

IEnumerable 型を明示的に指定した場合にのみ、2 番目のオーバーロードが選択されます。両方のケースで 2 番目のオーバーロードを選択する方法はありますか?

4

4 に答える 4

7

List<Customer>最初のオーバーロードは、完全に一致するT が として推論されるため、より適切に一致します。2 番目のオーバーロードの場合、T を として推論するCustomerため、パラメーターは になりますIEnumerable<Customer>。これは、 より正確に一致しませんList<Customer>

于 2012-03-25T14:15:45.303 に答える
5

そうは思わないでください。この場合、タイプに関して正確な一致が少ないIEnumerable<T>ため、オーバーロードが常に呼び出される可能性はないと思います。具体的なを指定しない場合、この場合、最適な方法は常に最初の方法になります。TIEnumerable<T>

于 2012-03-25T12:43:32.787 に答える
1

Fluent Assertion 2.0 では、上記の問題を適切な方法で解決することができました。ここでそれについてすべて読んでください: http://www.dennisdoomen.net/2012/09/asserting-object-graph-equivalence.html

于 2012-09-05T18:33:58.660 に答える