ReSharper красный подчеркивание на вывод типа в VS 2010 - PullRequest
6 голосов
/ 05 июня 2011

Я получаю странную ошибку в VS 2010. У меня есть проект, настроенный на использование .NET Framework 4. Когда я набираю код:

var record = ...;

// returns IEnumerable<Staff>
var staff = new StaffRepository().GetAll(); 

// The method has two signatures:
// CreateSelectList(IEnumerable<object> enumerable, string value)
// CreateSelectList(IDictionary<object, object> enumerable, string value)
StaffList = SelectListHelper.CreateSelectList(staff, record.Staff);

CreateSelectList в основном берет перечисляемые объекты, преобразует их в строки, используя ToString(), а затем автоматически выбирает переданную строку.

Проблема заключается в том, что этот код получает красное подчеркивание в VS 2010 с ошибкой, указывающей, что он не может разрешить метод.

Однако, если я изменю код для явного произнесения типа:

IEnumerable<Staff> staff = new StaffRepository().GetAll();
StaffList = SelectListHelper.CreateSelectList(staff, record.Staff);

VS 2010 больше не выдает ошибку. Насколько я понимаю из обобщений, эти два фрагмента кода должны быть одинаковыми для компилятора, так почему же он подчеркивает ошибку?

Также:

Это также решит проблему:

var staff = new StaffRepository().GetAll();
StaffList = SelectListHelper.CreateSelectList(from s in staff select s, record.Staff);

ReSharper:

Я пытался удалить каталог _ReSharper, но безуспешно. Я все еще получаю подчеркивание. Однако, если я приостановлю (т.е. выключу) ReSharper, красное подчеркивание исчезнет, ​​так что это определенно вызвано ReSharper.

Код:

По запросу, вот код.

Репозиторий персонала:

namespace Foo.Client.Business.Repositories {
    public class StaffRepository : StaffRepositoryBase<Staff, StaffCriteria, Discriminator> {

        public StaffRepository(Discriminator discriminator) : base(discriminator) {
        }

        protected override Staff CreateStaff(MembershipUser user) {
            return new Staff(user);
        }

    } // end class
}

Вот StaffRepositoryBase (где определен GetAll):

namespace Foo.Common.Business.Repositories {
    public abstract class StaffRepositoryBase<TStaff, TStaffCriteria, TDiscriminator> 
        : IStaffRepository<TStaff, TStaffCriteria, TDiscriminator>
        where TStaff : class, IStaff<TDiscriminator>
        where TStaffCriteria : class, IStaffCriteria {
        ...

        protected abstract TStaff CreateStaff(MembershipUser user);

        public virtual IEnumerable<TStaff> GetAll() {
            return from u in Membership.GetAllUsers().Cast<MembershipUser>()
                   let s = CreateStaff(u)
                   where s.Discriminator.Equals(Discriminator)
                   select s;
        }

        public virtual IEnumerable<TStaff> GetAll(LimitCriteria criteria) {
            var staffs = GetAll()
                .Skip(criteria.Skip.GetValueOrDefault())
                .Take(criteria.Take.GetValueOrDefault());

            return staffs;
        }

        public virtual IEnumerable<TStaff> GetAll() {
            return from u in Membership.GetAllUsers().Cast<MembershipUser>()
                   let s = CreateStaff(u)
                   where s.Discriminator.Equals(Discriminator)
                   select s;
        }

        ...
    }
}

Ответы [ 5 ]

3 голосов
/ 05 июня 2011

Я бы предположил, что возвращаемый тип - это List вместо Ienumerable, и это то, о чем VS плачет. Я предполагаю, что оба кода работают, но ему нравятся вещи, которые должны быть явными.

2 голосов
/ 16 июня 2011

Вы указали в комментариях, что рассматриваемый проект ранее был нацелен на .NET3.5.

Для проекта, нацеленного на .NET 3.5, Resharper подчеркнет описанный вами способ. Учитывая, что вы сейчас нацелены на .NET4, Решарпер по-прежнему считает, что вы находитесь в .NET3.5 по какой-то причине.

Вы можете попробовать

  1. Очистить кеш Resharper (Resharper -> Options -> Environment/General -> Clear Caches)
  2. Воссоздать файл проекта (csproj) как проект .NET4 с самого начала.
  3. Используйте Resharper 6.0 Beta (только что вышло), поскольку, похоже, эта проблема не возникает
1 голос
/ 05 июня 2011

Когда вы набираете, VS выполняет переводчик. Когда он не может определить тип переменной, он выдает красную ошибку подчеркивания. Это может произойти как ошибка VS или его надстроек (таких как Resharper, просто мое предположение)

Когда вы компилируете, компилятор C # выполняет всю тяжелую работу, он просматривает все ссылки и заменяет var на соответствующий тип, так что ошибки подчеркивания красного цвета исчезают.

Вы можете попробовать очистить свое решение, закрыть VS и перезапустить его, это может помочь или нет, но стоит попробовать

0 голосов
/ 10 января 2014

Проект выгрузки и перезагрузки помог мне решить эту проблему.

0 голосов
/ 14 июня 2011

Проблема в том, что CreateSelectList принимает IEnumerable<Object>, а не IEnumerable<Staff>. Даже если Staff наследует от Object, IEnumerable<Staff> не наследуется от IEnumerable<Object>. Это распространенная ошибка, которую люди делают с генериками.

Я бы предложил изменить подпись CreateSelectList на:

CreateSelectList<T>(IEnumerable<T> enumerable, string value)
...