You're returning the result of your iterator method instead of enumerating it. Iterator methods use deferred execution. As a result, it is not actually doing anything until well after the connection it will use has been disposed. That's why it "just stepped over" the method and why it failed at some arbitrary later time.
You can fix this problem in two ways. Either get all of the results ahead of time and return them, eagerly getting the items before disposal occurs, using a method like ToArray:
return dbConn.SqlRetrieveMultiple(query, operation).ToArray();
or you can ensure disposal is delayed until after the items have been lazily retrieved, by making your outer method an iterator method as well:
using(var dbConn = new SqlConnection(Settings.Instance.DbConnectionString))
{
const String query = "SELECT TOP 10 Title, Content FROM Article";
Func<SqlDataReader, Article> operation = reader => reader.ToArticle();
foreach (var e in dbConn.SqlRetrieveMultiple(query, operation))
yield return e;
}
However, keep in mind that if users iterate this lazy version twice, they will end up opening two connections. That may or may not be what you want.