代码之家  ›  专栏  ›  技术社区  ›  Rey

表达式树不能包含out参数变量声明

c#
  •  0
  • Rey  · 技术社区  · 7 年前

    我使用c#7.3和新特性来创建一个泛型方法,其中类型应该是枚举。

    我有这样的方法:

    public static bool TryConvertToEnum<T>(this int value, out T returnedValue) 
        where T : struct, Enum
    {  
        if (Enum.IsDefined(typeof(T), value))
        {
            returnedValue = (T)Enum.ToObject(typeof(T), value);
            return true;
        }
    
        returnedValue = default;
        return false;
    }
    

    它将尝试将int转换为特定的枚举。我尝试在两个案例中使用这种方法。一个有效,另一个无效。

    if (documentTypeId.TryConvertToEnum(out DocumentType returnedValue)
        && returnedValue == DocumentType.Folder)
    {
        //In this case it works fine
    }
    

    如果我尝试在select方法中使用此选项,它将不起作用:

    var comments = await DatabaseService.GetAll(filter)
        .OrderByDescending(x => x.Id)
        .ToPaginated(page)
        .Select(x => new PostCommentViewModel
        {
            Id = x.Id,
            Status = x.Status.TryConvertToEnum(out PostCommentStatusType returnedValue) ?
                returnedValue : PostCommentStatusType.None //Here it does not work
        }).ToListAsync();
    

    在第二种情况下,它不允许构建项目。

    它给出了一个错误:表达式树不能包含out参数 变量声明

    当我悬停时,RSharper会显示一个弹出窗口,说明: 表达式树不能包含out参数变量声明

    可以 ,不确定表达式树是否可以有out参数。。。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Rey    7 年前

    var comments = DatabaseService.GetAll(filter)
        .OrderByDescending(x => x.Id)
        .ToPaginated(page)
        .ToList()//Applied ToList here
        .Select(x => new PostCommentViewModel
        {
            Id = x.Id,
            Comment = x.Comment,
            Created = x.Created,
            Name = x.Name,
            ParentId = x.ParentId,
            PostId = x.PostId,
            Status = x.Status.TryConvertToEnum(out PostCommentStatusType returnedValue) ?
                returnedValue : PostCommentStatusType.None 
        }).ToList();