2011-02-06 3 views
4

я просто просмотрел «C# в глубину» и наткнулся на следующий код:Добавление двух функций?

Func<string> stringFunc =() => ""; 
Func<object> objectFunc =() => new object(); 
Func<object> combined = objectFunc + stringFunc; 

Я уверен, что добавление двух функций не имеет смысла в математике, так почему бы любой программист хочет перегрузку бинарного operator+ для функций? Это, по-видимому, прекрасный пример того, почему операторы перегрузки могут наносить вред (и я вообще поддерживаю идею перегрузки оператора).

  1. Что значит добавить две функции в C#? (Я C# noob, так что медведь со мной.)

  2. Вы согласны с тем, что это была ошибка при проектировании, чтобы перегрузить operator+?

  3. Что было бы лучшим синтаксисом для достижения того, что есть operator+ здесь?

+1

Обычно вы не используете 'MultiCastDelegates' функции, возвращающие что-либо (return-type не' void'). – CodesInChaos

ответ

3

delegate1 + delegate2 Запись создаст третий экземпляр делегата, который сочетает в себе первые два, называя все функции в обоих делегатов.
Он предназначен в основном для мероприятий.

Documentation

+0

Ага, так что это как снятие (Haskell) оператора запятой (C++)? :) Результат первой функции молча игнорируется, тогда? Чувствует себя очень запутанным для меня использовать 'operator +' для целей «цепочки методов», но, возможно, это только я ... – fredoverflow

+0

@FredOverflow делегаты обычно ничего не возвращают, поэтому обычно нечего игнорировать. – alex

+0

@alex: Действительно? Поэтому, если я добавляю два 'Func ', я получаю 'Func ' (вместо 'Func ')? – fredoverflow

2

Добавление двух функций идеально смысл в математике. Когда вы принимаете представление о том, что функции являются операторами, тогда пространство всех таких операторов является линейным пространством (при некоторых условиях). Это очень продуктивная точка зрения, которая дает много полезной математической проницательности.

Конечно, это не то, что здесь происходит, но я хотел поставить вас прямо на математическую сторону вашего вопроса!

+0

Можете ли вы пояснить на примере? Что означает «двоичный плюс» + «двоичное умножение»? – fredoverflow

+0

Я могу видеть, как вы могли бы разумно определить, скажем, добавление, на пространстве функций с одинаковыми доменами и содоменами, но в этом случае функции имеют разные содомены? –

+1

@FredOverflow: В этом случае существует возможное определение. '(плюс + умножить): (x, y) -> plus (x, y) + умножить (x, y)' –

Смежные вопросы