Я столкнулся с этим вопросом. Мое исправление заключалось в создании дочерней схемы. См. Ниже пример для ваших моделей.
---- Персональная модель
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);
Одним из возможных подходов является использование именованных параметров:
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());
}
Это, вероятно, должно быть задокументировано в коде, чтобы не удивлять следующего разработчика, и, как отмечено в комментариях, написать соответствующий вызывается автоматический тест для проверки правильности перегрузки.
Это не имеет никакого отношения к тому, является ли лямбда выражением лямбда или выражением лямбда (как наиболее кратко показано, когда вы заменяете лямбду выражения лямбда на выражение лямбда и поведение не меняется).
Существует множество способов, позволяющих настроить лямбду на несколько возможных перегрузок. Этот специфичен для более новых версий, но другие методы применяются начиная с C # 1.0 (а специфическая обработка анонимных методов и устранение неоднозначности разрешения перегрузки должна существовать с момента введения анонимных методов).
Правила определения того, какая перегрузка вызывается, изложены в разделе 7.5.3.3 спецификаций C #. В частности, когда параметр является анонимным методом, он всегда предпочитает перегрузку, у которой делегат (или выражение) имеет возвращаемое значение, а не возвращаемое значение. Это будет верно, будь то выражение лямбда или выражение лямбда; это относится к любой форме анонимной функции.
Таким образом, вам нужно либо предотвратить совпадение перегрузки, сделав анонимный метод недопустимым для Func<int>
, либо явно принудительно заставить тип быть Action
, чтобы компилятор не устранял его неоднозначность. [ 115]
Вы можете добавить приведение к for Action
, хотя он получает немного LISP'y со всеми круглыми скобками:
M((Action)(() => throw new Exception()));
Не идеально, но если вы хотите максимальная ясность:
Action thrw = () => throw new Exception();
M(thrw);
Чтобы добавить ко всем разумным ответам, вот очаровательный неразумный ответ:
((Action<Action>)M)(() => throw new Exception());