Дерево выражения не может содержать объявление переменной аргумента out

Я использую 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
}

Если я попытаюсь использовать это в методе выбора, это не сработает:

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

Во втором случае это не позволяет построить проект.

It gives the error: An expression tree may not contain an out argument variable declaration

Когда я нахожусь, RSharper показывает всплывающее окно с сообщением: Дерево выражений не может содержать объявление переменной выходного аргумента

Я немного смущен частью мая, не уверен, может ли дерево выражений иметь параметры или нет ...

Кто-нибудь знает, почему это происходит?

дубликат: stackoverflow.com/questions/44228502/…

Jazb 26.10.2018 04:06

@JohnB, если вы внимательно посмотрите, он говорит о локальных функциях, что не в моем случае. Возможно, это может быть вызвано той же проблемой, но определенно не тем же :)

Rajmond Burgaj 26.10.2018 04:08

слово may в контексте можно заменить словом can. may на английском - это как allowed to, тогда как can больше похож на physically able to do или something possible.

Jazb 26.10.2018 04:15
1
3
2 569
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

На самом деле это казалось легким решением. Мне нужно было только материализовать данные перед применением функции select: (ладонь).

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 для его ускорения, если не заинтересованы в отслеживании - я полагаю, что это не так.

Jazb 26.10.2018 04:17

@JohnB благодарит за совет, но это происходит внутри метода GetAll :)

Rajmond Burgaj 26.10.2018 04:19

Лучше использовать AsEnumerable, чтобы избежать создания ненужного промежуточного списка.

juharr 26.10.2018 04:28

Другие вопросы по теме