Suppose you have a class Person :
public class Person
{
   public string Name { get; set;}
   public IEnumerable Roles {get; set;}
}
          
        
The typical problem with exposing the private List as an IEnumerable is that the client of your class can mess with it by casting. This code would work:
  var p = new Person();
  List roles = p.Roles as List;
  roles.Add(Role.Admin);
  You can avoid this by implementing an iterator:
public IEnumerable Roles {
  get {
    foreach (var role in mRoles)
      yield return role;
  }
}