''yield'' permits to return a part of a result in a executing loop. Please look at the following code that does not uses ''yield'': foreach cFile as string in GetFiles( "c:\" ) WriteLine( cFile ) next return function GetFiles( cFolder as string ) as List local aFiles as string[] local oFiles as List WriteLine( "start creating list" ) oFiles := List{} aFiles := Directory.GetFiles( cFolder ) foreach cFile as string in aFiles oFiles:Add( cFile ) next WriteLine( "end creating list" ) return oFiles As you would expect, this code shows the follwing output: start creating list end creating list c:\bootmgr c:\BOOTNXT c:\bootTel.dat c:\hiberfil.sys c:\lang.txt c:\pagefile.sys c:\swapfile.sys If you change the code to use yield, you need to change the type of your function - and your function cannot more have any ''return'' statement: foreach cFile as string in GetFiles( "c:\" ) WriteLine( cFile ) next function GetFiles( cFolder as string ) as IEnumerable local aFiles as string[] local oFiles as List WriteLine( "start creating list" ) oFiles := List{} aFiles := Directory.GetFiles( cFolder ) foreach cFile as string in aFiles yield return cFile next WriteLine( "end creating list" ) This code produces the following output (please note that the output is created by the calling function **before** the called function is finished!): start creating list c:\bootmgr c:\BOOTNXT c:\bootTel.dat c:\hiberfil.sys c:\lang.txt c:\pagefile.sys c:\swapfile.sys end creating list To explain a bit more: the ''yield'' returns the member of the list, and the calling code can work immediatly with instead of waiting for the called function to be complete. This is particularly useful if you have longer processes and need to refresh the user interface.