将实现通用接口的类分配给泛型变量时出错

时间:2017-03-03 06:33:21

标签: c# generics casting

参考InvalidCastException on Generics,我已根据自己的应用调整了给出的答案。举个例子:

public interface IData
{
    string getValue();
}

public interface IController<in T> where T : IData
{
    string formString(T data);
}

public class DataImplA : IData
{
    public string getValue()
    {
        return "DataImplA";
    }
}

public class ControllerImplA : IController<DataImplA>
{
    public string formString(DataImplA data)
    {
        return "ControllerImplA, " + data.getvalue();
    }
}

public class Program
{
    private static IController<IData> controller;

    public static void main(string[] args)
    {
        // Line with error
        Program.controller = (IController<IData>)new ControllerImplA();

        Console.WriteLine(Program.controller.formString(new DataImplA()));
    }
}

在运行期间,指示的行将触发

  

InvalidCastException:无法转换类型&#39; ControllerImplA&#39;的对象输入&#39; IController`1 [IData]。

我尝试更改为Program.controller = (IController<IData>)new ControllerImplA<DataImplA>();,但这会导致编译错误The non-generic type 'ControllerImplA' cannot be used with type arguments

然后我尝试将类定义更改为public class ControllerImplA<DataImplA> : IController<DataImplA>,但新编译错误是:

  

类型&#39; DataImplA&#39;不能用作类型参数&#39; T&#39;通用类型或方法&#39; IController T&#39;。来自&#39; DataImplA&#39;没有装箱转换或类型参数转换。到&#39; IData&#39;。

我不想使用public class ControllerImplA<T> : IController<T>,因为约束条件是ControllerImplA只能使用DataImplAControllerImplB只能使用DataImplB和等等。

我应该如何更正原始代码?

1 个答案:

答案 0 :(得分:0)

在我看来,Generic类实际上是类的占位符。通过类型“T”,它在运行时创建不同的类型/类。这意味着IController<IData>IController<DataImplA>是完全不同的类,它们没有继承关系。