参考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
只能使用DataImplA
,ControllerImplB
只能使用DataImplB
和等等。
我应该如何更正原始代码?
答案 0 :(得分:0)
在我看来,Generic类实际上是类的占位符。通过类型“T”,它在运行时创建不同的类型/类。这意味着IController<IData>
和IController<DataImplA>
是完全不同的类,它们没有继承关系。