Метод расширения C# не существует
Кажется, я не могу найти следующий метод расширения в другом классе в том же пространстве имен (MyProject.Util
).
using System.Collections.Specialized;
namespace MyProject.Util
{
public static class Extensions
{
public static string Get(
this NameValueCollection me,
string key,
string def
)
{
return me[key] ?? def;
}
}
}
Как вы можете видеть, это в основном другая версия foo[bar] ?? baz
, но я до сих пор не понимаю, почему VS2008 не компилируется, сообщая, что нет версии Get
принимает два аргумента.
Есть идеи?
6 ответов
Вы импортируете свое пространство имен (с using MyProject.Util
) в файле, где вы используете метод? Сообщение об ошибке может быть неочевидным, поскольку ваш метод расширения имеет то же имя, что и существующий метод.
Вы не можете использовать метод расширения как статический метод, как в NameValueCollection.Get
, Пытаться:
var nameValueCollection = new NameValueCollection();
nameValueCollection.Get( ...
Класс находится в той же сборке, что и класс, в котором он используется? Если нет, вы добавили ссылку на эту сборку?
Следующее, кажется, работает для меня...
using System.Collections.Specialized;
namespace MyProject.Util
{
class Program
{
static void Main(string[] args)
{
var nvc = new NameValueCollection();
nvc.Get( )
}
}
}
namespace MyProject.Util
{
public static class Extensions
{
public static string Get(
this NameValueCollection me,
string key,
string def
)
{
return me[key] ?? def;
}
}
}
Вы проверили свою целевую структуру?
Работает нормально, когда я пытаюсь. На самом деле существует только один режим отказа: забыть добавить оператор using для пространства имен, содержащего метод расширения:
using System.Collections.Specialized;
using MyProject.Util; // <== Don't forget this!
...
var coll = new NameValueCollection();
coll.Add("blah", "something");
string value = coll.Get("blah", "default");
У меня недавно была похожая проблема, и я проследил, что она не ссылается на System.Core (проект был скомпилирован с 3.5, но эта ссылка была случайно удалена при экспериментировании с VS2010/.Net 4.0).