[英]Extension methods overload choice
我有兩種擴展方法:
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類型時才選擇第二個重載。 有沒有辦法在兩種情況下都選擇第二次過載?
第一個重載是更好的匹配,因為T被推斷為List<Customer>
,它給出了完全匹配。 對於第二個重載,它會將T推斷為Customer
,因此參數將是IEnumerable<Customer>
,這與List<Customer>
匹配不太精確。
不要這么認為。 不要認為在這種情況下可能總是會調用IEnumerable<T>
重載,因為它在T
類型方面的匹配度較低 。 如果未指定具體的IEnumerable<T>
,則在這種情況下,最佳匹配將始終是第一種方法。
在Fluent Assertion 2.0中,我終於設法以一種體面的方式解決了上述問題。 閱讀所有相關內容: http : //www.dennisdoomen.net/2012/09/asserting-object-graph-equivalence.html
ShouldHave()具有雙重含義。 在第一種情況下,ShouldHave()有一個關於subject-parameter提供的對象的返回。 在第二種情況下,返回是關於枚舉中的項目,而不是關於枚舉本身。
如果我創建自己的集合並且我想測試這個集合本身(而不是項目),我當然希望調用ShouldHave(這個T主題)而不是ShouldHave(這個IEnumerable主題)。
也許你應該重新考慮你的設計。 第二個ShouldHave()做了兩件事,所以應該分成一個方法來提取集合項和調用你已經擁有的第一個ShouldHave()。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.