3

Activator.CreateInstance を使用してクラスを作成し、それを実装する汎用インターフェイスにキャストしようとしています。

実行時に「InvalidCastException」が発生するのはなぜですか (.Net 4.0)?

コードは次のとおりです。

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
    {
    }
}
4

2 に答える 2

1

あなたが得るものはですIActionValidator<IActionSomething>。は型パラメーターとしてマークされているため、IActionValidator<IActionSomething>に割り当てることはできません。IActionValidator<IAction>Tin

IActionValidator<IAction>という名前の変数に対してv、次のValidateメソッドがあると想像してください。

Validate(IAction action, out string failure);

vのインスタンスを指している場合、実装されていないを介してインスタンスを最初のパラメータにIActionValidator<IActionSomething>渡すことができます。ただし、正確には後者が必要です。したがって、コンパイラはこれを許可しません。IActionvIActionSomethingIActionValidator<IActionSomething>

于 2013-03-17T15:39:50.733 に答える