When working with object collections (like UI controls or base class lists), you often need to grab just the specific types. OfType and Cast look similar but behave very differently.
OfType<T>() checks each element. If it matches the type, it yields it. If it DOESN'T match, it simply **skips** it gracefully. Use this when your list is a mix of types.
Cast<T>() tries to force every element into the target type. If a single element fails to cast, it throws an InvalidCastException. Use this only when you are 100% sure the collection contains only that type.
Q: "Which is better for legacy code?"
Architect Answer: "Legacy collections from .NET 1.1 (like ArrayList) don't support generics. Use **Cast** to convert them into IEnumerable<T> so you can use modern LINQ methods. For modern collections, prefer **OfType** as it's more resilient to unexpected data."