C# 输入类型在lambda表达式内自动更改
在使用Fluent ValidationC# 输入类型在lambda表达式内自动更改,c#,.net,visual-studio,visual-studio-2012,lambda,C#,.net,Visual Studio,Visual Studio 2012,Lambda,在使用Fluent ValidationMust子句时,我注意到了一个非常奇怪的问题 假设我有这样的模型: public class PhoneDetail { public int PrefixId { get; set; } public string Digits { get; set; } } 下面是验证器: public PhoneDetailValidator() { this.RuleFor(phone => phone.Digits)
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
更改为PhoneDetail
。
我正在使用Visual Studio 2012
那是虫子还是什么
更新:
另外,值得一提的是,在第一种情况下,它可以进行编译。但是,在第二种情况下,编译器错误正在发生:
> Delegate 'System.Func<SportsStore.WebUI.Models.PhoneDetail,string,bool>'
> does not take 1 arguments
>委托“System.Func”
>不接受1个参数
这要么是IDE错误,要么是它试图通过向您展示另一个超负荷的Must
方法的IntelliSense来变得聪明。另一个重载采用稍微不同的Func
,其中包括根对象,因此您可以编写:
this.RuleFor(phone => phone.Digits)
.Must((phone, x) => phone.Digits == null);
它只显示包含实例类型(
PhoneDetails
)的名称。在我看来,它像一个IDE错误。事实上,我刚刚尝试了相同的代码,它向我显示了string
@DavidG可能是,我使用的是Visual Studio 2012。@FarhadJabiyev我没有2012要测试,但我建议如果关闭IDE并重新打开它就可以了。@DavidG我已经关闭并重新打开了它。还是一样。此外,我们也在我朋友的电脑上进行了测试。同样的结果。您可能也可以编写。Must((字符串x)=>x==null))
。@SimonMᶜKenzie你可以,但它有点多余,没有使用第二个重载。是的,但在同样的意义上,你没有使用lambda的第二个参数。它们都很凌乱,但我觉得(string x)
方法的优点是它不会更改已编译的代码。@SimonMᶜKenzie是的,但是OP在编译x=>x==null
时没有问题,只是IDE显示了一些奇怪的东西。我同意-但是如果我们所做的只是解决IDE呈现问题,那么我更愿意避免更改编译后的代码。