【发布时间】:2011-06-04 23:23:25
【问题描述】:
我在 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;
}
...
}
}
【问题讨论】:
-
GetAll方法的返回类型是什么? -
您确定要通过输入
IEnumerable<Staff> staff而不是IEnumerable<object> staff来修复它吗?见stackoverflow.com/questions/245607/… -
是的,它绝对是 IEnumerable
。如果这与它有关,我也在使用 ReSharper。 -
返回类型是声明为 IEnumerable
还是某个实现该接口的类? -
只是为了澄清一下,代码实际上并没有编译?或者它只是智能感知。我正在尝试实际重现您的问题,但无论我使用哪种显式实现的接口组合,VS 都不会抱怨。
标签: c# visual-studio-2010 resharper type-inference