Нуль-объединяющий оператор не принимает различные типы - PullRequest
0 голосов
/ 03 февраля 2020

Я начал с возврата пользовательского класса:

[HttpGet()]
public ActionResult<Round> Get(string id) =>
    this._roundsService.Get(id);

Метод Get в службе раундов может возвращать ноль, и он преобразуется в HTTP 204 Нет содержимого. Мне было интересно, как вернуть 404, когда я получаю нулевое значение:

[HttpGet()]
public ActionResult<Round> Get(string id) =>
    this._roundsService.Get(id) ?? NotFound();

Возможно, это не работает и выдает ошибку CS0019: Operator '??' cannot be applied to operands of type 'Round' and 'NotFoundResult'

Я открыт для другого -liners, которые бы возвращали нужный объект, если не ноль, и 404. если ноль.

Я использую C# 8.0 с каркасом netcoreapp3.0. Я не включил обнуляемую функцию. Может ли это быть причиной проблемы?

На всякий случай, вот метод в классе обслуживания:

public Round Get(string id) =>
    this._rounds.Find(round => round.Id == id).FirstOrDefault();

Ответы [ 2 ]

5 голосов
/ 03 февраля 2020

Когда вы звоните NotFound(), вы создаете NotFoundResult. Ваш метод имеет тип возврата ActionResult<Round>, но NotFoundResult на самом деле не наследуется от ActionResult<Round>, поэтому вы не можете вернуть объект NotFoundResult напрямую.

Когда вы вводите return NotFound(), тогда что на самом деле происходит то, что компилятор будет использовать неявный оператор ActionResult<T> (ActionResult), чтобы преобразовать NotFoundResult в ActionResult<Round>.

Это прекрасно работает, когда вы просто возвращаете значение напрямую, но это не будет работать при использовании в тройном условном выражении или в выражении с нулевым слиянием. Вместо этого вам придется выполнить преобразование самостоятельно:

public ActionResult<Round> Get(string id) =>
    this._roundsService.Get(id) ?? new ActionResult<Round>(NotFound());

Поскольку конструктор из ActionResult<T> принимает любой ActionResult, вы можете просто передать ему NotFoundResult убедитесь, что он преобразован правильно.

Конечно, вы также можете разделить это снова и заставить преобразователь выполнить преобразование для вас:

public ActionResult<Round> Get(string id)
{
    var result = this._roundsService.Get(id);
    if (result != null)
        return result;
    return NotFound();
}
0 голосов
/ 03 февраля 2020

Конечно, он не может этого сделать. Это только сокращение для if. Я думаю, что эквивалент того, что вы написали, будет примерно таким:

ActionResult<Round> result = this._roundsService.Get(id);
if(result == null)
  result = NotFound();
return result;

И на этом этапе компилятор действительно запутался, почему вы пытаетесь присвоить возвращаемое значение NotFound () переменной ActionResult.

...