gpt4 book ai didi

c# - 尝试将具体对象转换为通用接口(interface)时出现“InvalidCastException”

转载 作者:太空宇宙 更新时间:2023-11-03 13:45:35 25 4
gpt4 key购买 nike

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

为什么我在运行时 (.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
{
}
}

最佳答案

你得到的是一个 IActionValidator<IActionSomething> . IActionValidator<IActionSomething>不能分配给 IActionValidator<IAction> ,因为 T被标记为 in类型参数。

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

Validate(IAction action, out string failure);

现在,如果v指向 IActionValidator<IActionSomething> 的实例, 你可以传递 IAction通过 v 实例化为第一个参数没有实现 IActionSomething .但是,IActionValidator<IActionSomething> 恰恰需要后者。 .因此,编译器不会让你这样做。

关于c# - 尝试将具体对象转换为通用接口(interface)时出现“InvalidCastException”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15462533/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com