【问题标题】:Adding two functions?添加两个功能?
【发布时间】:2011-02-06 14:21:20
【问题描述】:

我刚刚浏览了“C# in Depth”,偶然发现了以下代码:

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

我很确定添加两个函数在数学中毫无意义,那么为什么任何程序员都希望函数重载二进制 operator+ 呢?这似乎是一个完美的例子,说明为什么重载运算符 可以 有害(我通常支持运算符重载的想法)。

  1. 在 C# 中添加两个函数是什么意思? (我是 C# 菜鸟,请耐心等待。)

  2. 您是否同意在此处重载operator+ 是设计错误?

  3. 什么是更好的语法来实现 operator+ 在这里所做的一切?

【问题讨论】:

  • 您通常不会将MultiCastDelegates 与返回任何内容的函数一起使用(返回类型不是void)。

标签: c# operator-overloading functor addition


【解决方案1】:

编写delegate1 + delegate2 将创建第三个委托实例,它结合了前两个实例,调用两个委托中的所有函数。
它主要用于活动。

Documentation

【讨论】:

  • 啊哈,这就像解除 (Haskell) 逗号运算符 (C++)? :) 第一个函数的结果被默默地忽略了,然后呢?将operator+ 用于“方法链接”的目的让我感到非常困惑,但也许这只是我......
  • @FredOverflow 代表通常不返回任何内容,因此通常没有什么可忽略的。
  • @alex:真的吗?所以如果我添加两个Func&lt;string&gt;,我会得到一个Func&lt;void&gt;(而不是Func&lt;string&gt;)?
  • @Fred:委托添加通常与 void 委托(用于事件处理程序)一起使用
  • 啊哈,所以这个例子是不切实际的。很公平。不过,我发现 T + T 没有返回 T 令人担忧(这是您对 operator+ 的期望,对吧?)。
【解决方案2】:

两个函数相加在数学中是非常有意义的。当您认为函数是运算符时,所有此类运算符的空间都是线性空间(在某些条件下)。这是一个非常有效的观点,可以产生很多有用的数学见解。

当然,这不是这里发生的事情,但我想把你的问题放在数学方面!

【讨论】:

  • 你能举例说明一下吗? binary plus + binary multiply 是什么意思?
  • 我可以看到您如何合理地定义,比如加法,在具有相同域和共域的函数空间上,但在这种情况下,函数具有不同的共域?
  • @FredOverflow:在这种情况下,有一个可能的定义。 (plus + multiply): (x, y) -&gt; plus( x, y ) + multiply(x, y)
  • 考虑从 R^n 到 R^n 的所有线性函数的空间。例如,如果 n 为 3,那么您可以认为该空间由所有 3x3 实矩阵填充。这些函数本身在实场上形成一个线性空间 - 考虑标量 mult。和矩阵加法作为您的运算符。
猜你喜欢
  • 1970-01-01
  • 2022-07-24
  • 1970-01-01
  • 2020-10-25
  • 2018-12-03
  • 1970-01-01
  • 1970-01-01
  • 2012-06-09
  • 2010-12-04
相关资源
最近更新 更多