簡體   English   中英

兩個具有相同名稱的擴展方法

[英]Two extension methods with same name

我有以下兩種擴展方法(方法的主體對我的問題不是特別重要,但無論如何包括代碼)

public static class DictionaryExtensions
{
    public static TValue GetValue<TKey, TValue>(this IDictionary<TKey, TValue> source, TKey key, TValue defaultValue)
    {
        return (source.ContainsKey(key) ? source[key] : defaultValue);
    }
}

public static class WebExtensions
{
    public static T GetValue<T>(this HttpContext context, string name, T defaultValue)
    {
        object value = context.Request.Form[name] ?? context.Request.QueryString[name];
        if (value == null) return defaultValue;
        return (T)value;
    }
}

這兩個方法共享相同的名稱,但它們擴展了兩種非常不同的類型。 我希望以下代碼很簡單,編譯器能夠選擇適當的擴展方法:

var myDict = new Dictionary<int, string>()
{
    { 1, "foo" },
    { 2, "bar" }
};
var result = myDict.GetValue(5, "baz");

但是,由於某些未知原因,Visual Studio拒絕使用以下編譯時錯誤編譯我的代碼:“類型'System.Web.HttpContext'在未引用的程序集中定義。您必須添加對程序集的引用' System.Web'“。 此錯誤告訴我編譯器選擇了WebExtensions類中的GetValue擴展方法,而不是DictionaryExtension類中的GetValue擴展方法。

我能夠解決以下問題:

var result = DictionaryExtensions.GetValue(myDict, 5, "baz");

但我試圖理解為什么編譯器首先被混淆了。 有人知道為什么嗎?

另一種選擇是將2個Extension類分解為單獨的名稱空間,並且不要using WebExtensions類的消費代碼中添加using語句。 這樣編譯器就不會嘗試將GetValue解析為WebExtensions

只需執行編譯器所說的內容並添加對System.Web.dll的引用。 然后它應該編譯。

存在這些擴展方法類的外部程序集依賴於System.Web.dll。 編譯器應該能夠找出重載,但為了做到這一點,它需要引用HttpContext存在的程序集,它位於System.Web.dll中。

另一方面,如果您不希望使用擴展方法程序集的項目依賴於System.Web.dll,則需要在單獨的程序集中定義這2個擴展方法類。

@Steve Danner也有一個很好的解決方案 :將兩個擴展方法類放在同一個程序集中的不同命名空間中,並省略包含WebExtensions類的命名空間的using語句。

我偶爾會遇到System.Runtime.Serialization,System.ServiceModel.Activation等問題。當你有一個兩次刪除的依賴項時,可能會發生這種情況。 換句話說,你的根項目取決於一個程序集,它取決於另一個第三個程序集的類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM