C# ';无效卡斯特例外';在尝试将具体对象强制转换为泛型接口时

C# ';无效卡斯特例外';在尝试将具体对象强制转换为泛型接口时,c#,.net,C#,.net,我正在尝试使用Activator.CreateInstance创建一个类,并将其转换为它实现的通用接口 为什么我在运行时(.Net 4.0)得到“InvalidCastException” 代码如下: namespace CastingGenerics { class Program { static void Main(string[] args) { var typeFromSomewhere = typeof(Acti

我正在尝试使用Activator.CreateInstance创建一个类,并将其转换为它实现的通用接口

为什么我在运行时(.Net 4.0)得到“InvalidCastException”

代码如下:

namespace CastingGenerics
{
    class Program
    {
        static void Main(string[] args)
        {
            var typeFromSomewhere = typeof(ActionSomethingValidator);

            // This line throw 'System.InvalidCastException'
            // "Unable to cast object of type 'CastingGenerics.ActionSomethingValidator' to type 'CastingGenerics.IActionValidator`1[CastingGenerics.IAction]'."
            var castingError = (IActionValidator<IAction>)Activator.CreateInstance(typeFromSomewhere);
        }
    }

    internal interface IAction
    {
    }

    internal interface IActionValidator<in T>
        where T : IAction
    {
        bool Validate(T action, out string failure);
    }

    internal abstract class ActionValidator<T> : IActionValidator<T>
        where T : IAction
    {
        public abstract bool Validate(T action, out string failure);
    }

    internal class ActionSomethingValidator : ActionValidator<IActionSomething>
    {
        public override bool Validate(IActionSomething action, out string failure)
        {
            failure = string.Empty;
            return true;
        }
    }

    internal interface IActionSomething : IAction
    {
    }
}
namespace casting泛型
{
班级计划
{
静态void Main(字符串[]参数)
{
var typefromwhere=typeof(ActionSomethingValidator);
//此行抛出“System.InvalidCastException”
//“无法将类型为'CastingGenerics.ActionSomethingValidator'的对象强制转换为类型为'CastingGenerics.IActionValidator'1[CastingGenerics.IAction]'。”
var castingError=(IActionValidator)Activator.CreateInstance(typefromwhere);
}
}
内部接口隔离
{
}
内部接口IActionValidator
其中T:IAction
{
bool验证(T操作,输出字符串失败);
}
内部抽象类ActionValidator:IActionValidator
其中T:IAction
{
公共抽象bool验证(T操作,输出字符串失败);
}
内部类ActionSomethingValidator:ActionValidator
{
公共重写bool验证(IACTIONSOMThing操作,输出字符串失败)
{
failure=string.Empty;
返回true;
}
}
内部接口IActionSomething:IAction
{
}
}

您得到的是一个
IActionValidator
<无法将code>IActionValidator分配给
IActionValidator
,因为
T
在类型参数中标记为

想象一下,对于名为
v
IActionValidator
变量,有以下
Validate
方法:

Validate(IAction action, out string failure);
现在,如果
v
指向
IActionValidator
的实例,您可以通过
v
IAction
实例传递给第一个参数,该参数不实现
IActionSomething
。但是,
IActionValidator
恰恰需要后者。因此,编译器不允许您这样做。

一种方法是使用

dynamic smth=Activator.CreateInstance(typefromwhere)

由于编辑器在设计时无法确定类型,因此将丢失自动完成功能。但是,您仍然能够通过手工编码来调用这些方法。
smth.Validate(()=>true,”)

即使我从
IActionValidator
中删除
中的
关键字,它仍然不起作用。avivr:当然;如果没有
in
关键字,则
IActionValidator
IActionValidator
都不能相互分配。使用
关键字中的
,可以将
IActionValidator
分配给
IActionValidator
,但不能反过来分配。使用
out
关键字可以实现这一点,但这反过来又会与您声明的
Validate
相矛盾。我同意@O.R.Mapper。由于ActionValidator类上的约束,强制转换失败。因此类ActionSomethingValidator只能强制转换为IActionValidator。