Метод расширения 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).

Другие вопросы по тегам