C# Type Checking Explained: typeof vs GetType() vs is | CodeTrail