ReSharper红色强调VS 2010中的类型推断

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)

wal*_*wal 2

您在评论中指出,相关项目之前是针对 .NET3.5 的。

对于面向 .NET 3.5 的项目,Resharper 将以您描述的方式加下划线。鉴于您现在的目标是 .NET4,Resharper 出于某种原因仍然认为您处于 .NET3.5。

你可以尝试

  1. 清除 Resharper 缓存 ( Resharper -> Options -> Environment/General -> Clear Caches)
  2. 从头开始将项目 (csproj) 文件重新创建为 .NET4 项目
  3. 使用Resharper 6.0 Beta(刚刚发布),因为它似乎没有这个问题