Это потому, что универсальные классы C # не являются ковариантными. C # пытается удержать вас от следующих действий:
Request<Response> castTest = login;
castTest.Response = someOtherKindOfResponse;
Этот пример, возможно, более понятен в списках. Представьте, что сработало следующее:
var someStringList = new List<String>();
var someObjectList = ((List<Object>)someStringList; // This throws a compile exception, thankfully
someObjectList.Add(1); // If the above worked, then this would compile, but would throw a runtime exception