Почему параметр, не позволенный в рамках анонимного метода?

Большинство наивных подходов к проблеме имеет некоторые серьезные проблемы. Худшее - то, как bash.org и кавычки дисплеев qdb.us - пользователи могут проголосовать за кавычку (+1) или вниз (-1), и список лучших кавычек отсортирован по общему сетевому счету. Это страдает от ужасной предвзятости времени - более старые кавычки накопили огромные числа положительных голосов через простую долговечность, даже если они являются только незначительно юмористическими. Этот алгоритм мог бы иметь смысл, если бы шутки стали более забавными, когда они стали старше, но - доверяют мне - они не делают.

существуют различные попытки зафиксировать это - рассмотрение количества положительных голосов на период времени, взвешивание более свежих голосов, реализация системы затухания для более старых голосов, вычисление отношения положительных отрицательным голосам, и т.д. Большинство страдает от других дефектов.

лучшее решение - я думаю - тот что веб-сайты Самое Забавное Самое Милое , Самое Справедливое , и Лучшая Вещь использование - измененная система голосования Condorcet :

система дает каждому число на основе из вещей, с которыми она стояла, какой процент их она обычно бьет. Таким образом, каждый получает счет процента NumberOfThingsIBeat / (NumberOfThingsIBeat + NumberOfThingsThatBeatMe). Кроме того, вещи запрещаются от главного списка, пока они не сравнились с разумным процентом набора.

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

Для получения дополнительной информации о реализации таких систем страница Wikipedia на Оцениваемые Пары должны быть полезными.

алгоритм требует, чтобы люди сравнили два объекта (Ваша опция Pick-A-or-B), но откровенно говоря, это - хорошая вещь. Я полагаю, что очень хорошо признано в теории решений, что люди значительно лучше в сравнении двух объектов, чем они при абстрактном рейтинге. Миллионы лет эволюции делают нас хорошими в выборе лучшего яблока от дерева, но ужасный при решении, как тесно яблоко мы выбрали, рубит к истинной платонической Форме appleness. (Это, между прочим, почему Аналитический Процесс Иерархии так изящен..., но это добирается немного вне темы.)

Один конечный пункт для создания - то, который ТАК использует алгоритм для нахождения лучших ответов, который очень похож на bash.org алгоритм для нахождения лучшей кавычки. Это работает хорошо здесь, но перестало работать ужасно там - в значительной степени, потому что старое, очень расчетное, но теперь устаревший ответ здесь, вероятно, будет отредактирован. bash.org не позволяет редактировать, и не ясно, как Вы даже пошли бы о редактировании старых десятилетием шуток о теперь датированных интернет-мемах, даже если Вы могли... В любом случае моя точка - то, что правильный алгоритм обычно зависит от деталей Вашей проблемы.:-)

14
задан Community 23 May 2017 в 12:33
поделиться

3 ответа

В некотором роде это обман. Выходные параметры - это параметры ref . Просто есть дополнительный атрибут для значения, используемого языком C #. Причина их запрета точно такая же, как у параметров ref .

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

Представьте, например, что параметр out ссылается на локальную переменную в стеке. Лямбда может выполняться в любой произвольный момент в будущем и, следовательно, может выполняться, когда этот кадр стека больше не действителен. Что тогда означает параметр out ?

29
ответ дан 1 December 2019 в 07:19
поделиться

Это в основном связано с тем фактом, что параметры анонимного делегата / лямбда-выражений представляют собой захваченные переменные и захватывающие ref / Переменные out не имеют никакого смысла в C # / CLR, поскольку для этого потребуются ref / out поля внутри. Также обратите внимание, что я объединяю оба этих ключевых слова, потому что они фактически одинаковы.

Если вам нужно полное объяснение, Эрик Липперт подробно обсудил этот проект в своем блоге. (См., В частности, абзацы внизу.)

6
ответ дан 1 December 2019 в 07:19
поделиться

Единственное различие между параметрами out и ref состоит в том, что параметр out будет иметь [out] К нему применен токен . Это то же самое, что и CLR.

Чтобы реализовать это, компилятор должен был бы сгенерировать поля ref , которые не поддерживаются.

Если подумав об этом, вы поймете, что нет смысла разрешать анонимному методу использовать параметр out .

Что будет делать следующий код?

static Func<object, object> Mess(out object param) {
    param = "Original";
    return i => param = i;
}
static Func<object, object> MessCaller() {
    object local;
    return Mess(out local);
}
static vouid Main() {
    Console.WriteLine(MessCaller()("New"));
    //The local variable that the lambda expression writes to doesn't exist anymore.
}
1
ответ дан 1 December 2019 в 07:19
поделиться
Другие вопросы по тегам:

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