[英]Cannot Convert UserQuery enum to enum
我正在尝试执行以下代码(在LINQPad中),并且我的LINQ语句出错
无法将类型
System.Collections.Generic.IEnumerable<UserQuery.ResultCode>
隐式转换为UserQuery.ResultCode
。
为什么?
这是代码:
public enum ResultCode {
Big,
Bad,
Messy
}
public class ValidationResult {
public bool IsValid = false;
public ResultCode Code;
public override string ToString(){
return String.Format("IsValid: {0}, Code: {1}",IsValid, Code);
}
}
public class RuleMap {
public Func<bool> Fact;
public ResultCode Code;
public List<int> Actions;
}
public class RulesProcessor{
List<RuleMap> rules;
public RulesProcessor(){
rules = new List<RuleMap>{
new RuleMap {Fact = CheckLeft, Code = ResultCode.Big,
Actions = new List<int> {2, 3}
},
new RuleMap {Fact = CheckRight, Code = ResultCode.Bad,
Actions = new List<int> {1, 2}
},
new RuleMap {Fact = CheckDown, Code = ResultCode.Messy,
Actions = new List<int> {1, 3}
},
};
}
public bool CheckLeft(){
return true;
}
public bool CheckRight(){
return false;
}
public bool CheckDown(){
return true;
}
public ValidationResult EvaluateRulesOnAction(int actionType){
ValidationResult result = new ValidationResult();
ResultCode badRule = from foo in rules
where !foo.Fact() && foo.Actions.Contains(actionType)
select foo.Code;
if (badRule != null){
result.Code = badRule;
}else{
result.IsValid = true;
}
return result;
}
}
void Main()
{
var foo = new RulesProcessor();
foo.EvaluateRulesOnAction(1).Dump();
foo.EvaluateRulesOnAction(3).Dump();
}
如何将查询更改为。
IEnumerable<ResultCode> badRule = from foo in rules
where !foo.Fact() && foo.Actions.Contains(actionType)
select foo.Code;
并将ValidationResult更改为
public IEnumerable<ResultCode> Code;
原因是每个from x in y select x
形式的LINQ查询都返回IEnumerable<TypeOfX>
。
如果您确定最多可以有一条错误规则,则可以将代码更改为此:
ResultCode badRule = (from foo in rules
where !foo.Fact() && foo.Actions.Contains(actionType)
select foo.Code).SingleOrDefault();
如果有多个坏规则,但您只对第一个感兴趣,请使用以下命令:
ResultCode badRule = (from foo in rules
where !foo.Fact() && foo.Actions.Contains(actionType)
select foo.Code).FirstOrDefault();
两个查询中的“ OrDefault”都表示您要具有返回类型的默认值 。 对于引用类型,它为null
。
但是,在您的代码中,查询将返回一个ResultCode
类型的枚举。 枚举不能为null
,因此查询之后的if
永远不会产生预期的结果,因为badRule == null
始终为false
。
您应该将代码更改为此:
var badRule = (from foo in rules
where !foo.Fact() && foo.Actions.Contains(actionType)
select foo).FirstOrDefault();
if (badRule != null){
result.Code = badRule.Code;
}else{
result.IsValid = true;
}
你读错了吗?
您的LINQ查询返回的是ResultCodes的集合(IEnumerable),而不是单个ResultCode。
因为这:
ResultCode badRule = from foo in rules
where !foo.Fact() && foo.Actions.Contains(actionType)
select foo.Code;
返回ResultCodes的集合,并且您正尝试将其分配给单个ResultCode变量。
如果知道只有一个结果,则可以使用First来选择它并将其分配给badRule。 如果可能有1个或0个结果,则使用FirstOrDefault。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.