- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
调查时this question我很好奇 C# 4.0 中新的协变/逆变特性将如何影响它。
在 Beta 1 中,C# 似乎不同意 CLR。回到 C# 3.0,如果你有:
public event EventHandler<ClickEventArgs> Click;
...然后在其他地方你有:
button.Click += new EventHandler<EventArgs>(button_Click);
...编译器会呕吐,因为它们是不兼容的委托(delegate)类型。但在 C# 4.0 中,它编译得很好,因为在 CLR 4.0 中,类型参数现在标记为 in
。 ,所以它是逆变的,因此编译器假定多播委托(delegate) +=
将工作。
这是我的测试:
public class ClickEventArgs : EventArgs { }
public class Button
{
public event EventHandler<ClickEventArgs> Click;
public void MouseDown()
{
Click(this, new ClickEventArgs());
}
}
class Program
{
static void Main(string[] args)
{
Button button = new Button();
button.Click += new EventHandler<ClickEventArgs>(button_Click);
button.Click += new EventHandler<EventArgs>(button_Click);
button.MouseDown();
}
static void button_Click(object s, EventArgs e)
{
Console.WriteLine("Button was clicked");
}
}
但是虽然它可以编译,但它在运行时不起作用(ArgumentException
:委托(delegate)必须是同一类型)。
如果您只添加两种委托(delegate)类型中的一种也没关系。但是当添加第二个时,多播中两种不同类型的组合会导致异常。
我猜这是 beta 1 中 CLR 中的一个错误(编译器的行为看起来是正确的)。
候选发布更新:
以上代码不再编译。一定是 TEventArgs
的逆变在EventHandler<TEventArgs>
委托(delegate)类型已回滚,因此现在该委托(delegate)具有与 .NET 3.5 中相同的定义。
也就是我看的beta肯定有:
public delegate void EventHandler<in TEventArgs>(object sender, TEventArgs e);
现在回到:
public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e);
但是 Action<T>
委托(delegate)参数 T
仍然是逆变的:
public delegate void Action<in T>(T obj);
Func<T>
也是如此的 T
是协变的。
只要我们假设多播委托(delegate)的主要用途是在事件上下文中,这种折衷就很有意义。我个人发现我从不使用多播委托(delegate),除非作为事件。
所以我想 C# 编码标准现在可以采用新规则:不要从通过协变/逆变相关的多个委托(delegate)类型形成多播委托(delegate)。如果您不知道那是什么意思,请避免使用 Action
。为了安全起见。
当然,这个结论对 the original question that this one grew from 有影响。 ...
最佳答案
非常有趣。您不需要使用事件来看到这种情况的发生,事实上我发现使用简单委托(delegate)更简单。
考虑 Func<string>
和 Func<object>
.在 C# 4.0 中,您可以隐式转换 Func<string>
至 Func<object>
因为您始终可以将字符串引用用作对象引用。但是,当您尝试将它们组合在一起时,事情就会出错。这是一个简短但完整的程序,以两种不同的方式演示了该问题:
using System;
class Program
{
static void Main(string[] args)
{
Func<string> stringFactory = () => "hello";
Func<object> objectFactory = () => new object();
Func<object> multi1 = stringFactory;
multi1 += objectFactory;
Func<object> multi2 = objectFactory;
multi2 += stringFactory;
}
}
这编译得很好,但是 Combine
调用(隐藏在 += 语法糖中)抛出异常。 (注释掉第一个以查看第二个。)
这绝对是个问题,虽然我不确定解决方案应该是什么。 在执行时委托(delegate)代码可能需要根据所涉及的委托(delegate)类型计算出最适合使用的类型。这有点恶心。如果有一个通用的 Delegate.Combine
就好了调用,但您无法真正以有意义的方式表达相关类型。
值得注意的一件事是协变转换是一个引用转换——在上面,multi1
和 stringFactory
引用同一个对象:不和写
Func<object> multi1 = new Func<object>(stringFactory);
(此时,下一行将无一异常(exception)地执行。)在执行时,BCL 确实必须处理 Func<string>
。和一个 Func<object>
合并;它没有其他信息可以继续。
这很讨厌,我真的希望它能以某种方式得到修复。我会提醒 Mads 和 Eric 这个问题,以便我们获得一些更明智的评论。
关于c# - .NET 4.0 和 C# 4.0 中的事件和委托(delegate)逆变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1120688/
要在 R 中绘制正态分布曲线,我们可以使用: (x = seq(-4,4, length=100)) y = dnorm(x) plot(x, y) 如 dnorm将 y 计算为 x 的函数,R 是否
@XmlTransient 阻止将 JavaBeans 属性映射到 XML 表示。是否存在与此相反的情况,这意味着即使 WebService 未使用的方法也会被映射?如果这不可能,是否存在解决方法?
我有以下键数组: var keys = [{userId: "333"}, {userId: "334"}] 这个对象数组: var users = [ {id: "333", firstName:
我正在寻找将字符串转换为类型的通用方法。 例如: class SomeThing { public void Add(T value) { //... } pub
我看到了this question , 并弹出这个想法。 有没有一种在 PHP 中执行此操作的有效方法? 编辑 有演示最好吗? 最佳答案 你可以使用 pear 包 Math_Matrix为此。 关于矩
如何在 python 中求逆矩阵?我自己实现了它,但它是纯 python,我怀疑那里有更快的模块可以做到这一点。 最佳答案 你应该看看 numpy如果您进行矩阵操作。这是一个主要用C语言编写的模块,比
是否有比使用 IF ELSE 构造更简单的方法来反转 bool 值? 通常我会使用! bool 值前面。但这在 Navision 中不起作用 最佳答案 您可以使用 NOT 关键字代替 !。 关于nav
假设我有一个对象响应。现在我想检查一个 bool 变量,success,在 Response 下并做一个早期返回是 response 不成功。 if(response == null || !resp
任何人都可以提供/引用多维行主要顺序的“索引->偏移”*转换的倒数。此外,(伪)代码将不胜感激。 http://en.wikipedia.org/wiki/Row-major_order 举个例子,简
我有一个看起来像这样的系统: z1 = 5*x1 + x2*cos(x3) z2 = x1*sin(x3) + 3*x2 z3 = 3*x1 - 2*x2 这是微分方程组的变换(只是为了提供一些背景信
我正在使用org.apache.commons.math3.transform类FastFourierTransformer,我现在尝试在真实数据集上应用FFT,并应用逆FFT来获取原始数据集。我的问
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 9 年前。 Improve
背景 我需要使用已知的累积分布函数 (CDF) 从相当复杂的概率密度函数 (PDF) 中随机采样,并且我正在尝试使用 inverse transform sampling 。这应该很容易做到,因为我有
是否有任何 System.identityHashCode (object) 的逆函数能够从 System.identityHashCode (object) 的结果中提供对象的值? 最佳答案 Sys
有没有办法在mysql中获取group by语句的逆?我的用例是删除所有重复项。 假设我的表格如下所示: ID | columnA | ... 1 | A 2 | A 3 | A 4
我有一个查询,它给我一个公司列表(tblprov)及其相应的类别(tblrubro) 两个表通过查找表 (tblprovxrubro) 相关 SELECT p.id, p.name, r.idCat,
我有一个 jpg 图像,在矩形中有一个圆形物体,我想使圆形物体的环境透明... (本例去除红色区域) 借助这个iOS make part of an UIImage transparent和“UIBe
我想知道是否可以在不需要临时数组的情况下通过 Cholesky 分解获得矩阵的逆。截至目前,我可以在不使用临时数组的情况下进行 cholesky 分解,但从那里我还没有想出一种方法来获得原始矩阵的逆矩
是否可以在 Angular 中使用逆$watch? 我的问题 我使用 Angular-translate,并且我想对每个缺少的翻译使用 $http.put 。但我收到此错误: "10 $digets(
我正在执行 radix-2 dif 逆 fft。我正在使用共轭和缩放的属性来返回结果。我共轭我的输入 vector ,执行常规 radix-2 fft(不是 ifft),共轭结果,然后按 1.0/N
我是一名优秀的程序员,十分优秀!