无法将类型'string'隐式转换为'bool'[If语句]

时间:2015-11-13 16:37:48

标签: c# asp.net-mvc-4

我在mvc中有这个验证

public static ValidationResult validaUsuariosNaLista(Reuniao item)
{
    var requeridos = item.Requeridos.Select(x => x.Login).Any();
    var informados = item.Informados.Select(y => y.Login).Any();
    var opcionais = item.Opcionais.Select(z => z.Login ? z.Login : null).Any();

    if (requeridos == informados || requeridos == opcionais || informados == opcionais)
        return new ValidationResult(Resources.Validations.ValidaUsuarioMesmaLista);

    return ValidationResult.Success;
}

我尝试在行中添加不同的

var opcionais = item.Opcionais.Select(z => z.Login ? z.Login : null).Any();

但显示错误

错误3无法将类型'string'隐式转换为'bool'

z.Login 字符串

验证是使该字段没有接收null的值。

如果没有它,它会突发错误。

我希望他收到null而不会给出错误。

如果同一个登录位于其他列表中,则选择列表中的z.login。他是错误。

我怎么能“如果”那样做?

3 个答案:

答案 0 :(得分:1)

如果z.Login是一个字符串,则该表达式无效:

z.Login ? z.Login : null

该表达式中的第一个元素必须是bool。在这种情况下你究竟想要检查什么? z.Login是否为null?如果是这种情况,那么您根本不需要条件:

.Select(z => z.Login)

由于您只是将null替换为null。或者,如果您想将空字符串解释为null,那么您可以使用以下内容:

.Select(z => string.IsNullOrEmpty(z.Login) ? nulll : z.Login)

虽然首先要用这行代码完成完成的内容并不是很清楚。 .Any()将返回bool,指示集合中是否存在任何匹配元素。但是由于你没有在.Any()中使用谓词,如果集合中有任何元素,它将返回true 。这不仅使.Select()呈现无意义,而且也没有告诉您.Select()中有关该条件的任何信息。

也许您正在尝试查找集合中是否有任何 null值?:

item.Opcionais.Any(z => z.Login == null)

或任何“null或empty”值?:

item.Opcionais.Any(z => string.IsNullOrEmpty(z.Login))

或相反,任何非空值?:

item.Opcionais.Any(z => !string.IsNullOrEmpty(z.Login))

依旧......

答案 1 :(得分:0)

我认为你要做的是检查Login是否为null或为空。假设您希望opcionais是基于.Any()语句的布尔值:

var opcionais = item.Opcionais.Select(z => z.Login ? z.Login : null).Any();

应该是

var opcionais = item.Opcionais.Any(z => !string.IsNullOrEmpty(z.Login));

答案 2 :(得分:0)

  

z.Login是一个字符串

     

验证是使该字段没有接收null的值。

这样做:

修改:更新此部分以查找重复项

public static ValidationResult validaUsuariosNaLista(Reuniao item)
{
    var requeridos = item.Requeridos.Any(x => string.IsNullOrWhiteSpace(x.Login));
    var informados = item.Informados.Any(x => string.IsNullOrWhiteSpace(x.Login));
    var opcionais  = item.Opcionais .Any(x => string.IsNullOrWhiteSpace(x.Login));

    //does every item have a value?
    if (requeridos || informados || opcionais)
        return new ValidationResult(Resources.Validations.ValidaUsuarioMesmaLista);

    //are all of the items unique?
    if (item.Requeridos.Count() + item.Informados.Count() + item.Opcionais.Count() > 
          item.Requeridos.Concat(item.Informados).Concat(item.Opcionais).Distinct().Count)
    {
       //some items are duplicated
    }

    return ValidationResult.Success;
}

而且,为了好玩,避免重复代码:

public static ValidationResult validaUsuariosNaLista(Reuniao item)
{
    var HasEmptyValue = s => s.Any(x => string.IsNullOrWhiteSpace(x.Login));

    //does every item have a value?
    if (HasEmptyValue(item.Requeridos) || HasEmptyValue(item.Informados) || HasEmptyValue(item.Opcionais))
        return new ValidationResult(Resources.Validations.ValidaUsuarioMesmaLista);

    //are all of the items unique?
    if (item.Requeridos.Count() + item.Informados.Count() + item.Opcionais.Count() > 
          item.Requeridos.Concat(item.Informados).Concat(item.Opcionais).Distinct().Count)
    {
       //some items are duplicated
    }

    return ValidationResult.Success;
}

虽然我不是100%关于类型推断在这里工作得多好......我必须看看编译器对它做了什么,并且我没有你的类型进行测试。但最糟糕的是,你必须明确var声明。