繁体   English   中英

无法将UserQuery枚举转换为枚举

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM