【问题标题】:Input type changes automatically inside lambda expression输入类型在 lambda 表达式中自动更改
【发布时间】:2015-04-28 12:11:38
【问题描述】:

我在使用 Fluent Validation Must 子句时注意到了一个非常奇怪的问题。

假设我有这样的模型:

public class PhoneDetail
{
    public int PrefixId { get; set; }
    public string Digits { get; set; }
}

这里是验证器:

public PhoneDetailValidator()
{
    this.RuleFor(phone => phone.Digits)
        .Must(x => x == null);
}

你认为x是什么类型的String?是的,你是对的。

但是,那这是什么?

它的类型已从 string 更改为 PhoneDetail。 我正在使用 Visual Studio 2012

是那个bug还是什么?

更新:

另外,值得一提的是,在第一种情况下它编译得很好。但是,在第二种情况下发生编译器错误:

> Delegate 'System.Func<SportsStore.WebUI.Models.PhoneDetail,string,bool>'
> does not take 1 arguments

【问题讨论】:

  • 它只显示包含实例类型的名称(PhoneDetails)。
  • 对我来说看起来像一个 IDE 错误。事实上,我刚刚尝试了相同的代码,它显示string
  • @DavidG 可能是,我使用的是 Visual Studio 2012。
  • @FarhadJabiyev 我没有 2012 年可供测试,但我怀疑如果您关闭 IDE 并重新打开它就可以了。
  • @DavidG 我已关闭并重新打开它。还是一样。此外,我们也在我朋友的电脑上对此进行了测试。结果相同。

标签: c# .net visual-studio visual-studio-2012 lambda


【解决方案1】:

这要么是一个 IDE 错误,要么是它试图通过向您展示 IntelliSense 来实现 Must 方法的另一个重载。其他重载之一采用稍微不同的Func,其中包括根对象,因此您可以编写:

this.RuleFor(phone => phone.Digits)
            .Must((phone, x) => phone.Digits == null);

【讨论】:

  • 你也可以写.Must((string x) =&gt; x == null))
  • @SimonMᶜKenzie 你可以,但它有点多余,不使用第二个重载。
  • 是的,但在同样的意义上,您没有使用 lambda 的第二个参数。它们都很乱,但我觉得(string x) 方法的优势在于它不会改变编译后的代码。
  • @SimonMᶜKenzie 是的,但是 OP 在编译 x =&gt; x == null 时没有问题,只是 IDE 出现了一些奇怪的问题。
  • 我同意 - 但如果我们所做的只是解决 IDE 渲染问题,那么我宁愿避免更改编译代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多