C# VS 2010中类型推断的ReSharper红色下划线

C# VS 2010中类型推断的ReSharper红色下划线,c#,visual-studio-2010,resharper,type-inference,C#,Visual Studio 2010,Resharper,Type Inference,我在VS2010中遇到了一个奇怪的错误。我有一个使用.NETFramework4的项目。当我键入代码时: var record = ...; // returns IEnumerable<Staff> var staff = new StaffRepository().GetAll(); // The method has two signatures: // CreateSelectList(IEnumerable<object> enumerable, stri

我在VS2010中遇到了一个奇怪的错误。我有一个使用.NETFramework4的项目。当我键入代码时:

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);
VS2010不再给出错误。我对泛型的理解是,这两段代码对于编译器来说应该是相同的,那么为什么它会给我一个错误下划线呢

此外:

这也将解决问题:

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

我尝试删除我的_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
}
下面是定义GetAll的StaffRepositoryBase:

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;
        }

        ...
    }
}

我猜返回类型是一个列表而不是Ienumerable,这就是VS所抱怨的。我假设这两个代码都可以工作,但它希望事情是明确的。

当您输入时,VS解释器可以工作。当它无法确定变量的类型时,会给您红色下划线错误。我猜这可能是由于VS或其附加模块(如Resharper)的错误造成的

编译时,C编译器会完成所有的艰苦工作,它会检查所有引用并用适当的类型替换var,这样红色下划线错误就消失了


您可以尝试清理解决方案,关闭VS并重新启动它,这可能有帮助,也可能没有帮助,但值得一试

问题是CreateSelectList采用的是IEnumerable,而不是IEnumerable。即使Staff从对象继承,IEnumerable也不会从IEnumerable继承。这是人们在使用泛型时经常犯的错误

我建议将CreateSelectList的签名更改为:

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

您已经在评论中声明了该项目之前的目标是.NET3.5

对于以.NET 3.5为目标的项目,Resharper将按照您描述的方式加下划线。考虑到您现在的目标是.NET4,Resharper仍然认为出于某种原因您在.NET3.5中

你可以试试

清除刷新器缓存刷新器->选项->环境/常规->清除缓存 从一开始就将项目csproj文件重新创建为.NET4项目 仅使用out,因为它似乎没有此问题
卸载和重新加载project帮助我解决了这个问题。

GetAll方法的返回类型是什么?您确定要通过键入IEnumerable staff而不是IEnumerable staff来修复它吗?是的,这绝对是数不清的。如果与此有关,我也在使用ReSharper。返回类型是声明为IEnumerable还是实现该接口的某个类?只是澄清一下,代码实际上并没有编译?或者仅仅是智能感知。我试图重现你的问题,但不管我使用什么显式实现的接口组合,VS都不会抱怨。它肯定是一个IEnumerable。IEnumerable接口是协变的。而且,代码很好,可以编译并工作。我认为这是一个关于ReSharper如何分析代码的问题。我升级到ReSharper 6 Beta版,它解决了这个问题。
CreateSelectList<T>(IEnumerable<T> enumerable, string value)