我是新来的所有匿名的特点和需要一些帮助。我已经得到了以下工作:

public void FakeSaveWithMessage(Transaction t)
{
    t.Message = "I drink goats blood";
}

public delegate void FakeSave(Transaction t);

public void SampleTestFunction()
{
    Expect.Call(delegate { _dao.Save(t); }).Do(new FakeSave(FakeSaveWithMessage));
}

但这完全是丑陋,我希望有内部的做可以匿名方式或甚至lambda如果这是可能的。我试过:

Expect.Call(delegate { _dao.Save(t); }).Do(delegate(Transaction t2) { t2.Message = "I drink goats blood"; });

Expect.Call(delegate { _dao.Save(t); }).Do(delegate { t.Message = "I drink goats blood"; });

但是,这些给我

不能把匿名方法的类型系统。委派的',因为它不是一个委托类型**编译错误。

我做错了什么?


因为马克*英格拉姆贴,似乎是最好的回答,虽然没有人明确说,要做到这一点:

public delegate void FakeSave(Transaction t);

Expect.Call(delegate { _dao.Save(t); }).Do( new FakeSave(delegate(Transaction t2) { t.Message = expected_msg; }));
有帮助吗?

解决方案

这是一个众所周知的错误信息。检查下面的链接,一个更详细的讨论。

http://staceyw1.wordpress.com/2007/12/22/they-are-anonymous-methods-not-anonymous-delegates/

基本上你只需要把投在你的匿名代表(你lambda表达).

在情况下的链接不断下降,这是一个复制的员额:

他们都是匿名的方法,不 匿名代表。
发表于十二月22日,2007年通过staceyw1

它不仅仅是一个谈论的焦点,因为 我们要是困难的。它可以帮助我们 原因,关于究竟是怎么回事。到是清楚的,有*没有这样的事情 作为一个匿名的委派。他们不 存在(不)。他们是"匿名的 方法"。这事如何 我们认为他们和我们如何谈论 它们。让我们看看 匿名方法的声明"委托() {...}".这实际上是两个不同的 业务和当我们想到它 这样,我们将永远不会迷茫 再次。第一件事编译器 不是创建匿名的方法 下面采用的推断 代表签名作为法 签名。这是不正确的说 该方法是"无名",因为它 没有一个名称和编译器 分配。这只是隐藏 正常图。接下来的事情,它不会 是创建一个委托的目的 所需要的类型包装的方法。此 被称为代表推断,并可以 能源的这种混乱。对于 这一工作,编译器必须 能找出(即推断)什么 委托类型,它将创造。它已 被已知的具体类型。让 编写一些代码看看为什么。

private void MyMethod()
{
}

不编译:

1) Delegate d = delegate() { };                       // Cannot convert anonymous method to type ‘System.Delegate’ because it is not a delegate type
2) Delegate d2 = MyMethod;                         // Cannot convert method group ‘MyMethod’ to non-delegate type ‘System.Delegate’
3) Delegate d3 = (WaitCallback)MyMethod;   // No overload for ‘MyMethod’ matches delegate ‘System.Threading.WaitCallback’

1号线不会因为汇编 编译器不能推断,任何代表 类型。它可以清楚地看到签名 我们的愿望,但没有混凝土 委托类型的编译可以看到。它可以创建一个匿名的类型 类型的委托于我们,但它没有 工作那样。2不行 编制一个类似的原因。甚至 虽然编译器知道的方法 签名,我们不是给它一个 委托类型和它不是只是 挑一个会发生的工作 (没有什么副作用的可能 有)。第3行不通的,因为 我们故意不匹配的方法 签署有一个代表具有一个 不同签署(如WaitCallback 需要和对象)。

编译:

4) Delegate d4 = (MethodInvoker)MyMethod;  // Works because we cast to a delegate type of the same signature.
5) Delegate d5 = (Action)delegate { };              // Works for same reason as d4.
6) Action d6 = MyMethod;                                // Delegate inference at work here. New Action delegate is created and assigned.

与此相反,这些工作。1号线工作的 因为我们告诉编译器是什么 代表使用的类型和它们匹配, 因此,它的工作。第5行的工作 同样的原因。注意我们使用特别 形成的"代表"不带括号.编译器推断的方法 签名演员和创建 匿名方法相同 签名作为推断代表 类型。第6行的工作,因为 MyMethod()和使用相同的行动 签名。

我希望这有所帮助。

也参见: http://msdn.microsoft.com/msdnmag/issues/04/05/C20/

其他提示

什么样的标记说。

问题是这样做需要一个委托参数。编译不能把匿名的方法,以代表中,只有一个"委托类型",即一个具体的类型来自代表。

如果这样做的功能已经采取了行动<>行动<,>...等等。重载,你就不需要投。

问题不是你的委托的定义,这是参数的做()方法的类型系统。委托,编译器产生的委托类型(FakeSave)不会隐含地转换系统。代表。

尝试增加一个投在你的匿名代表:

Expect.Call(delegate { _dao.Save(t); }).Do((Delegate)delegate { t.Message = "I drink goats blood"; });

尝试一些东西,如:

Expect.Call(delegate { _dao.Save(t); }).Do(new EventHandler(delegate(Transaction t2) { t2.CheckInInfo.CheckInMessage = "I drink goats blood"; }));

注意到加处理围绕该委托。

编辑:可不工作自从签名功能的处理和代理人是不一样的...解决您添加到底你的问题可能是唯一的方式。

此外,您可以创建一个通用的委托类型:

public delegate void UnitTestingDelegate<T>(T thing);

因此,委托没事务特定的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top