【发布时间】:2015-02-27 18:08:00
【问题描述】:
我有以下两个扩展方法(方法的主体对我的问题并不是特别重要,但无论如何包括代码)
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 类中的方法。
我能够解决以下问题:
var result = DictionaryExtensions.GetValue(myDict, 5, "baz");
但我试图理解为什么编译器首先会感到困惑。有人知道为什么吗?
【问题讨论】:
-
我无法重现您的问题。 dotnetfiddle.net/gNPuvD
-
DictionaryExtensions和WebExtensions是否都定义在同一个程序集中?还是不同的组件?听起来您的项目只需要引用 System.Web.dll 即可编译。 -
@danludwig 他们在同一个程序集中。我有一个程序集,其中对所有扩展方法进行了分组。但是,它与调用它们的位置不同。
-
您的错误表明您没有引用它需要定义
HttpContext的程序集,而不是它无法推断出您想要的方法。 -
@Selman22 因为
System.Web命名空间已经包含在小提琴中。
标签: c# extension-methods