Метод расширения C # не существует - PullRequest
2 голосов
/ 20 апреля 2010

Не получается найти следующий метод расширения в другом классе в том же пространстве имен (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 ]

5 голосов
/ 20 апреля 2010

Импортируете ли вы свое пространство имен (с using MyProject.Util) в файл, где вы используете метод? Сообщение об ошибке может быть неочевидным, поскольку ваш метод расширения имеет то же имя, что и существующий метод.

3 голосов
/ 20 апреля 2010

Вы не можете использовать метод расширения как статический метод, как в NameValueCollection.Get. Попробуйте:

var nameValueCollection = new NameValueCollection();
nameValueCollection.Get( ...
1 голос
/ 20 апреля 2010

Работает нормально, когда я пытаюсь. На самом деле существует только один режим сбоя: забыть добавить оператор использования для пространства имен, содержащего метод расширения:

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");
1 голос
/ 20 апреля 2010

Класс находится в той же сборке, что и класс, в котором он используется? Если нет, добавили ли вы ссылку на эту сборку?

1 голос
/ 20 апреля 2010

Мне кажется, что следующее работает ...

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;
        }
    }
}

Вы проверили свою целевую структуру?

0 голосов
/ 20 апреля 2010

У меня недавно была похожая проблема, и я обнаружил, что она не ссылается на System.Core (проект был скомпилирован с 3.5, но эта ссылка была случайно удалена при экспериментировании с VS2010 / .Net 4.0).

...