How to cast without using a helper function

Please help me understand why one option below will work but the other will not.

    public T GetService<T>() {
        try {
            MonoBehaviour mono = serviceReferences[typeof(T)];
            //return (T) mono;       // Does not work
            return Cast<T>(mono);    // Does work
        }
        catch(KeyNotFoundException) {
            throw new ApplicationException("The requested service is not registered");
        }
    }

    public T Cast<T>(object input) {
        return (T)input;
    }

Here’s an option…

public T GetService<T>() where T : MonoBehaviour, new() {
            if(!serviceReferences.ContainsKey(typeof(T))) {
                Debug.LogError("Could not find service: " + typeof(T) + ". Crash imminent!");
                return new T();
            }
            return (T)serviceReferences[typeof(T)];
        }