Ошибка компилятора Visual Studio 2010 для расширений базового класса

У меня есть класс С#, предоставляющий некоторые простые классы и некоторые расширения базового класса, такие как этот.

public static Boolean ToBooleanOrDefault(this String s, Boolean Default)
{
    return ToBooleanOrDefault((Object)s, Default);
}


public static Boolean ToBooleanOrDefault(this Object o, Boolean Default)
{
    Boolean ReturnVal = Default;
    try
    {
        if (o != null)
        {
            switch (o.ToString().ToLower())
            {
                case "yes":
                case "true":
                case "ok":
                case "y":
                    ReturnVal = true;
                    break;
                case "no":
                case "false":
                case "n":
                    ReturnVal = false;
                    break;
                default:
                    ReturnVal = Boolean.Parse(o.ToString());
                    break;
            }
        }
    }
    catch
    {
    }
    return ReturnVal;
}

Класс компилируется и, как представляется, не имеет проблем. Затем я ссылался на проект в веб-проекте, а VS2010 intellisense распознает расширения базового класса и F12/получил определение до исходного исходного кода, как и ожидалось. Однако, когда я компилирую веб-проект, я получаю сообщение об ошибке для каждого использования расширения базового класса...

Error   28  'string' does not contain a definition for 'ToBooleanOrDefault'

Мне кажется, что ссылка не используется компилятором, поэтому игнорирует все расширения моего базового класса. Идеи? Решение было перенесено из VS2008, где все работало нормально.

Ответ 1

Помимо распространенных ошибок (забывая включить пространство имен класса расширения), вы должны убедиться, что оба проекта используют одну и ту же версию .NET. Иногда проект v4 не будет правильно ссылаться на сборки, созданные для более ранних версий фреймворка

Получает меня все время

Ответ 2

После переноса был сделан отчет, возможно, с предупреждениями о том, что необходимо для ручной фиксации. То, что вы можете попытаться сделать, это удалить ссылку и подождать, пока IntelliSense не узнает ее (красные линии при каждом использовании ссылочных классов). Затем добавьте ссылку еще раз, посмотрите, компилируется ли она сейчас.

Обратите внимание, что речь идет не о базовом классе, а о том, что ваши методы расширения не найдены. Вы также можете проверить версию .NET проекта (методы поддержки расширения .NET 3.5 или более поздней версии) и проверить строку, которая вызывает ошибку: убедитесь, что доступен оператор using.

Ответ 3

ОК, думаю, мне удалось решить эту проблему... Вдохновленный предложенными ответами, в которых упоминаются проверки версий фреймов, я вернул веб-проект и его зависимости обратно к 3.5. Компиляция теперь прогрессирует с базовыми классами, которые выглядят нормально, но вместо этого появилось несколько qwerks, связанных с отсутствующими выражениями для Linq и неправильными пространствами имен. Исправив, что компиляция 3.5 прошла нормально. Проверка исходного кода во времени! Затем я переключил веб обратно на 4.0 и все скомпилировано. теперь он также позволяет мне возвращать зависимости обратно к 4.0, и все хорошо.