【问题标题】:ReSharper red underline on type inference in VS 2010VS 2010 中类型推断的 ReSharper 红色下划线
【发布时间】: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&lt;Staff&gt; staff 而不是 IEnumerable&lt;object&gt; staff 来修复它吗?见stackoverflow.com/questions/245607/…
  • 是的,它绝对是 IEnumerable。如果这与它有关,我也在使用 ReSharper。
  • 返回类型是声明为 IEnumerable 还是某个实现该接口的类?
  • 只是为了澄清一下,代码实际上并没有编译?或者它只是智能感知。我正在尝试实际重现您的问题,但无论我使用哪种显式实现的接口组合,VS 都不会抱怨。

标签: c# visual-studio-2010 resharper type-inference


【解决方案1】:

我猜想返回类型是 List 而不是 Ienumerable,这就是 VS 哭泣的原因。我假设这两个代码都有效,但它喜欢明确的事情。

【讨论】:

  • 绝对是IEnumerable
【解决方案2】:

您已在 cmets 中声明该项目之前针对 .NET3.5。

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

你可以试试

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

【讨论】:

  • 我升级到 ReSharper 6 Beta 并解决了这个问题。
【解决方案3】:

当您输入时,VS 会执行解释器工作。当它无法确定变量的类型时,它会给你红色下划线错误。这可能是 VS 或其加载项的错误(例如 Resharper,只是我的猜测)

当你编译时,C# 编译器会做所有的工作,它会查看所有引用并将var 替换为适当的类型,因此红色下划线错误消失了。

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

【讨论】:

    【解决方案4】:

    问题是 CreateSelectList 采用 IEnumerable&lt;Object&gt;,而不是 IEnumerable&lt;Staff&gt;。即使 Staff 继承自 Object,IEnumerable&lt;Staff&gt; 也不会继承自 IEnumerable&lt;Object&gt;。这是人们使用泛型时常犯的错误。

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

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

    【讨论】:

    • IEnumerable 接口是协变的。
    • 另外,代码很好(它可以编译和工作)。这是 ReSharper 如何分析我认为的代码的问题。
    【解决方案5】:

    卸载和重新加载项目帮助我解决了这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-29
      • 1970-01-01
      • 2011-09-19
      • 2017-06-10
      • 1970-01-01
      相关资源
      最近更新 更多