cdm*_*kay 6 c# resharper type-inference visual-studio-2010
我在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);
Run Code Online (Sandbox Code Playgroud)
CreateSelectList基本上采用可枚举的对象,使用它们将它们转换为字符串ToString(),然后自动选择传递的字符串.
问题是,此代码在VS 2010中出现红色下划线,并显示错误,表示无法解析该方法.
但是,如果我更改代码以明确说出类型:
IEnumerable<Staff> staff = new StaffRepository().GetAll();
StaffList = SelectListHelper.CreateSelectList(staff, record.Staff);
Run Code Online (Sandbox Code Playgroud)
VS 2010不再给出错误.我对泛型的理解是这两个代码片段应该与编译器相同,那为什么它给我一个错误下划线?
也:
这也将解决问题:
var staff = new StaffRepository().GetAll();
StaffList = SelectListHelper.CreateSelectList(from s in staff select s, record.Staff);
Run Code Online (Sandbox Code Playgroud)
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
}
Run Code Online (Sandbox Code Playgroud)
这是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;
}
...
}
}
Run Code Online (Sandbox Code Playgroud)
您在评论中指出,相关项目之前是针对 .NET3.5 的。
对于面向 .NET 3.5 的项目,Resharper 将以您描述的方式加下划线。鉴于您现在的目标是 .NET4,Resharper 出于某种原因仍然认为您处于 .NET3.5。
你可以尝试
Resharper -> Options -> Environment/General -> Clear Caches)