Недавно я столкнулся с странной проблемой, связанной с кастингом. Каждое обсуждение/сообщение, которое я видел, имеет тенденцию вращаться вокруг, используя литье, когда вы уверены в том, что объект будет выпущен, а также несколько деталей. Однако я не нашел, что аргументы за кодом ниже:Разница между оператором и литьем (дженерики)
class Program
{
static void Main(string[] args)
{
var h = new SomeCommandHandler();
var c = h as ICommandHandler<ICommand>; //this works as expected
//var c = (ICommandHandler<ICommand>)h; //this throws - why?
}
interface ICommand { }
class SomeCommand : ICommand { }
interface ICommandHandler<I> where I : ICommand { }
class SomeCommandHandler : ICommandHandler<SomeCommand> { }
}
Так почему же второй вызов выдает исключение? В чем разница между кастингом и оператором, о котором я не знаю?
EDIT: Он wpuld бросить в комментировал линии выше "Необработанное исключение: System.InvalidCastException: Не удается привести объект типа 'SomeCommandHandler' к типу 'ICommandHandler`1 [ConsoleApplication1.Program + ICommand]'"
@thecoop - рискуя догадку Это InvalidCastException ... –