Why do I get an InvalidCastException
with the following code?
public interface ICommandContext<out TAssociatedObject> : ICommandContext<object, TAssociatedObject> { }
public interface ICommandContext<TParameter, out TAssociatedObject> : ICommandContext
{
new TParameter Parameter { get; }
new TAssociatedObject AssociatedObject { get; }
}
public interface ICommandContext
{
object Parameter { get; }
object AssociatedObject { get; }
IMenuItem Menu { get; }
}
public class CommandHandlerContext<TParameter, TAssociatedObject> :
ICommandContext<TParameter, TAssociatedObject>
{
public CommandHandlerContext() { }
public CommandHandlerContext(TParameter parameter, TAssociatedObject associatedObject, IMenuItem menu)
{
Parameter = parameter;
AssociatedObject = associatedObject;
Menu = menu;
}
public TParameter Parameter { get; set; }
public TAssociatedObject AssociatedObject { get; set; }
public IMenuItem Menu { get; set; }
object ICommandContext.Parameter => Parameter;
object ICommandContext.AssociatedObject => AssociatedObject;
}
static class Testing
{
public static void Test()
{
var context = new CommandHandlerContext<object, IShell>();
var casted = (ICommandContext<object, IShell>)context;
var casted2 = (ICommandContext<IShell>)casted;
}
}
The line var casted2 = (ICommandContext<IShell>)casted;
throws an InvalidCastException
and it's bugging me why is that.
I want to be able to define two generics arguments, but also only define the second one and have the first default to object.