c# - Code in base class method not executing when using "base" keyword -
i'm seeing strange problem when overriding abstract method , trying call base class's method i'm overriding.
//in dll "a" namespace rhino.etl.core.operations { using system; using system.collections; using system.collections.generic; public class row {} public interface ioperation { ienumerable<row> execute(ienumerable<row> rows); } public abstract class abstractoperation : ioperation { public abstract ienumerable<row> execute(ienumerable<row> rows); } public abstract class abstractdatabaseoperation : abstractoperation { } public abstract class sqlbulkinsertoperation : abstractdatabaseoperation { public override ienumerable<row> execute(ienumerable<row> rows) { console.writeline("sqlbulkinsertoperation"); return rows; } } } //in console app "b" namespace mystuff { using system; using system.collections; using system.collections.generic; class program { static void main(string[] args) { actualetloperation e = new actualetloperation(); e.execute(new row[0]); console.readline(); } } public abstract class sqlbulkinsertwithtruncateoperation : sqlbulkinsertoperation { public override ienumerable<row> execute(ienumerable<row> rows) { console.writeline("truncate"); base.execute(rows); return rows; } } public class actualetloperation : sqlbulkinsertwithtruncateoperation { } }
basically, sqlbulkinsertoperation not need do, need little work before , after call execute(rows) on overriding it. code in sqlbulkinsertoperation.execute(rows) not executed.
when running code in debugger in visual studio debugger code's not executed. when hover mouse on "base" in visual studio editor knows base class of type sqlbulkinsertoperation.
what missing?
edit: i've found problem... , ironically, "psychic debugging" comment eric wasn't far off, given this blog post. here's short complete program demonstrate what's going on...
using system; using system.collections.generic; public class row {} public abstract class basedatabaseoperation { public abstract ienumerable<row> execute(ienumerable<row> rows); } public abstract class sqlbulkinsertoperation : basedatabaseoperation { public override ienumerable<row> execute(ienumerable<row> rows) { console.writeline("in sqlbulkinsertoperation.execute"); foreach (var row in rows) { yield return row; } } } public class myoverride : sqlbulkinsertoperation { public override ienumerable<row> execute(ienumerable<row> rows) { console.writeline("in myoverride.execute"); return base.execute(rows); } } class test { static void main() { basedatabaseoperation x = new myoverride(); x.execute(new row[0]); } }
that print "in myoverride.execute" *won't" print "in sqlbulkinsertoperation.execute"... because method implemented iterator block.
of course, can demonstrate much more simply:
using system; using system.collections.generic; class test { static ienumerable<string> foo() { console.writeline("i won't printed"); yield break; } static void main() { foo(); } }
nothing using return value of method - it's being passed main
, nothing ever calls getenumerator()
on it, , movenext()
on result... body of method never executed.
see my article on iterator blocks, part 2 of eric's blog post, or download chapter 6 home page of first edition of c# in depth (chapter 6 covers iterator blocks, , free) more details on this.
Comments
Post a Comment