0

私はベースコントローラーを持っています:

Public MustInherit Class InjuredWorkerController(Of TManager As IInjuredWorkerManagerBase)

それから私はホームコントローラーを持っています:

Public Class HomeController
    Inherits InjuredWorkerController(Of IInjuredWorkerManager)

IInjuredWorkerManager継承するIInjuredWorkerManagerBase

これがキャスト例外をスローするのはなぜですか:

Dim manager = CType(filterContext.Controller, InjuredWorkerController(Of IInjuredWorkerManagerBase)).Manager

タイプ 'MyClaim.Controllers.HomeController' のオブジェクトをタイプ 'MyClaim.Controllers.InjuredWorkerController`1[SAIF.Web.Mvc.MyClaim.IInjuredWorkerManagerBase]' にキャストできません。

4

1 に答える 1

1

InjuredWorkerController共変性と反変性はインターフェイスとデリゲートでのみ機能するため、機能させるにはインターフェイスを抽出する必要があります。

このコードはコンパイルして実行します (C# コンソール アプリ、私は VB.Net に精通していません...):

using System;

namespace TestApplication
{
    public interface IInjuredWorkerController<out TManager>
        where TManager : IInjuredWorkerManagerBase
    {
        TManager Manager { get; }
    }

    public abstract class InjuredWorkerController<TManager>
        : IInjuredWorkerController<TManager>
        where TManager : IInjuredWorkerManagerBase, new()
    {
        protected InjuredWorkerController()
        {
            Manager = new TManager();
        }

        public TManager Manager { get; private set; }
    }

    public interface IInjuredWorkerManagerBase
    {
        string Name { get; }
    }

    public interface IInjuredWorkerManager
        : IInjuredWorkerManagerBase {}

    public class InjuredWorkerManager : IInjuredWorkerManager
    {
        public string Name
        {
            get { return "Homer"; }
        }
    }

    public class HomeController
        : InjuredWorkerController<InjuredWorkerManager> {}

    internal class Program
    {
        private static void Main()
        {
            var controller = new HomeController();
            var manager = ((IInjuredWorkerController<IInjuredWorkerManagerBase>)controller).Manager;

            Console.Out.WriteLine(manager.Name);
            Console.ReadKey();
        }
    }
}

このテーマに関するEric Lippert のブログ シリーズは必読です。

于 2012-08-02T19:13:33.070 に答える