我正在用 C#(闪存到统一)从 ActionScript 移植/重写我们的生产系统。
我遇到了 C# 的奇怪行为,这使我无法实现我们的设计。
以下代码重现了该问题:
using System;
using System.Collections.Generic;
namespace DotNetTest
{
class MainClass
{
public static void Main (string[] args)
{
// first, expected behaviour
Specific s = new Specific ();
N data = new N ();
Console.WriteLine (s.foo(data));
// now I'm going to push s on a stack
Stack<Generic> stack = new Stack<Generic> ();
stack.Push (s);
// and use it again: different behaviour !
var s2 = stack.Peek ();
Console.WriteLine (s2.foo (data));
}
}
public class M
{
}
public class N : M
{
}
public class Generic
{
public String foo(M n)
{
return "I don't want this generic foo for M";
}
}
public class Specific : Generic
{
public String foo(N m)
{
return "I want this specific foo for N (child of M)";
}
}
}
当我运行此代码时,我得到以下结果
I want this specific foo for N (child of M)
I don't want this generic foo for M
在Main
我有一个变量s
。第一个Console.Write
使用正确的重载方法foo
。Specific
在我推入s
堆栈并再次将其弹出后,第二次中的相同函数调用Console.Write
意外地使用了foo
from Generic
。
显然,在这个例子中,我可以s2
在这里转换Generic
以获得预期的结果。似乎.net(或我使用的单声道)取决于确定使用哪种方法的运行时绑定。
在我们的生产系统中,铸造是没有选择的。
有没有办法在第二次通话中获得预期的结果?
提前致谢,
克里斯