【问题标题】:An expression tree may not contain an out argument variable declaration表达式树可能不包含输出参数变量声明
【发布时间】:2018-10-26 02:04:06
【问题描述】:

我正在使用具有新功能的 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();

在第二种情况下,它不允许构建项目。它给出了错误:

表达式树可能不包含输出参数 变量声明

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

我对可能部分有点困惑,不确定表达式树是否可以有参数...

有人知道为什么会这样吗?

【问题讨论】:

  • @JohnB 如果你仔细看,它谈到了本地函数,这不是我的情况。也许它可能是由相同的问题引起的,但绝对不一样:)
  • 上下文中的单词may可以替换为单词canmay 在英语中就像说allowed tocan 更像是physically able to dosomething possible

标签: c#


【解决方案1】:

实际上,这似乎很容易解决。我只需要在应用选择功能之前实现数据:(掌心)。

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(); 

【讨论】:

  • 如果您对跟踪不感兴趣,您也可以使用AsNoTracking 来加快速度——我假设您不感兴趣。
  • @JohnB 感谢您的建议,但它在GetAll 方法内部发生:)
  • 最好使用AsEnumerable 以避免创建不需要的中间列表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-06
  • 2012-05-13
  • 2013-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多