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