Я получаю странную ошибку в 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.
Код:
По запросу, вот код.
Вот StaffRepository:
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;
}
...
}
}