.NET framework bug? Parameter of override method does not change
本问题已经有最佳答案,请猛点这里访问。
以下代码无法按预期工作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | using System; using System.Data; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { MyClass cl = new MyClass(); cl.doSomething(); } } public class MyClass : BaseClass { protected override void doSelect(DataTable dt) { dt = null; } public void doSomething() { base.Fill(); } } public class BaseClass { private DataTable dtMain = null; protected virtual void doSelect(DataTable dt) { } protected void Fill() { dtMain = new DataTable(); this.doSelect(dtMain); if (dtMain == null) Console.WriteLine("as I would expect"); else Console.WriteLine("why not changed???"); } } } |
我用其他引用类型测试了它,但行为相同。这是框架错误吗?当我使用ref关键字时,它按我的预期工作:
1 2 3 | protected virtual void doSelect(ref DataTable dt) { } and so on |
如果有人能帮我,那就太好了!
考虑以下内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | class Program { static void Main(string[] args) { var pr = new Program(); f(pr); if (pr == null) Console.WriteLine("Can't happen"); else Console.WriteLine("Always happen"); } public static void f(Program prog) { prog = null; } } |
当您调用
当您将
同样的情况也会发生在您的案例中。
这不是一个错误。这是预期的行为。除非使用ref关键字,否则将按值传递,因此方法的"客户机"端的值不会更改。读取ref关键字的ms引用:
https://msdn.microsoft.com/en-us/library/14akc2c7.aspx
当
通过
不使用
这实际上与您使用
这里的
1 2 | protected virtual DataTable doSelect(DataTable dt) { /* ... */ } |
确保您的方法名反映了该方法的作用。