Ein Methode, mit dem Schlüsselwort 
yield return innerhalb, wird vom Compiler intern in eine State-Machine übersetzt, so daß bei jedem Aufruf der Methode der nachfolgende Code (nach dem 
yield return) weiter ausgeführt wird. Wichtig dabei ist, daß der Rückgabetyp 
IEnumerable<T> ist, so daß eine Folge generiert wird.
Bei statischen Werten würde man z.B. eine List<T> zurückgeben:
		                     
             C#-Quelltext
                        C#-Quelltext                    
           	 										| 1:2:
 3:
 4:
 
 | List<int> Test(){
 return new List<int> { 2, 3, 5, 7, 11, 13, 17, 19 };
 }
 | 
		
	  
Bei der Methode 
DividerSequence() wird quasi eine unendliche Liste erzeugt, aber eben mittels "Lazy Evaluation" ausgewertet, d.h. erst wenn wirklich auf die generierte Enumeration zugegriffen wird.
Der Code
		                     
             C#-Quelltext
                        C#-Quelltext                    
           	 										| 1:2:
 
 | foreach (int x in DividerSequence())Console.WriteLine(x);
 | 
		
	   erzeugt also diese unendliche Liste von Primfaktorkandidaten.
Edit: Durch 
yield break oder wenn das Ende der Methode erreicht ist, wird kein weiteres Element der Folge mehr generiert - was meistens benutzt wird, um endliche Folgen (Auflistungen) zu generieren.
Etwas ausführlicher wird es noch unter 
Essential .NET: Benutzerdefinierte Iteratoren mit „yield“ sowie 
Yield return in C# (auf englisch) erklärt.
PS: Die Schleife mit 
+=6 wird genommen, da dies eine Optimierung gegenüber 
+=2 (nur ungerade Zahlen ist), da ja alle durch 3 teilbaren ungeraden Zahlen (9, 15, 21, ...) keine Primzahlen sein können.