Как я могу заставить бросок быть оператором, а не выражением (в лямбда-выражении)?

Я столкнулся с этим вопросом. Мое исправление заключалось в создании дочерней схемы. См. Ниже пример для ваших моделей.

---- Персональная модель

const mongoose = require('mongoose');
const SingleFriend = require('./SingleFriend');
const Schema   = mongoose.Schema;

const productSchema = new Schema({
  friends    : [SingleFriend.schema]
});

module.exports = mongoose.model('Person', personSchema);

*** Важно: SingleFriend.schema -> обязательно используйте строчные буквы для схемы

--- Схема ребенка

const mongoose = require('mongoose');
const Schema   = mongoose.Schema;

const SingleFriendSchema = new Schema({
  Name: String
});

module.exports = mongoose.model('SingleFriend', SingleFriendSchema);
7
задан Ulf Åkerstedt 1 April 2019 в 21:11
поделиться

4 ответа

Одним из возможных подходов является использование именованных параметров:

public static void M(Action action) { /* do stuff */ }

public static void M(Func<int> func) { /* do stuff */ }

public static void Main()
{
    M(action: () => throw new Exception());
}

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

0
ответ дан mistertribs 1 April 2019 в 21:11
поделиться

Это не имеет никакого отношения к тому, является ли лямбда выражением лямбда или выражением лямбда (как наиболее кратко показано, когда вы заменяете лямбду выражения лямбда на выражение лямбда и поведение не меняется).

Существует множество способов, позволяющих настроить лямбду на несколько возможных перегрузок. Этот специфичен для более новых версий, но другие методы применяются начиная с C # 1.0 (а специфическая обработка анонимных методов и устранение неоднозначности разрешения перегрузки должна существовать с момента введения анонимных методов).

Правила определения того, какая перегрузка вызывается, изложены в разделе 7.5.3.3 спецификаций C #. В частности, когда параметр является анонимным методом, он всегда предпочитает перегрузку, у которой делегат (или выражение) имеет возвращаемое значение, а не возвращаемое значение. Это будет верно, будь то выражение лямбда или выражение лямбда; это относится к любой форме анонимной функции.

Таким образом, вам нужно либо предотвратить совпадение перегрузки, сделав анонимный метод недопустимым для Func<int>, либо явно принудительно заставить тип быть Action, чтобы компилятор не устранял его неоднозначность. [ 115]

0
ответ дан marc_s 1 April 2019 в 21:11
поделиться

Вы можете добавить приведение к for Action, хотя он получает немного LISP'y со всеми круглыми скобками:

M((Action)(() => throw new Exception()));

Не идеально, но если вы хотите максимальная ясность:

Action thrw = () => throw new Exception();
M(thrw);
0
ответ дан DaveShaw 1 April 2019 в 21:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: