我将实现类转换为通用接口时遇到问题。 我在一个实现此接口的类中有几个内部类。 然后我有一个方法应该返回这些类中的任何一个,但它包含的强制转换失败了T!= String。
样品:
public interface IMyInterface<out T> where T : IConvertible
{/*Contents*/}
internal class MyStringClass : IMyInterface<String> {/*Contents*/}
internal class MySingleClass : IMyInterface<Single> {/*Contents*/}
IMyInterface<IConvertible> CreateMyObject(Type type)
{
return (IMyInterface<IConvertible>)Activator.CreateInstance(type);
}
看到String是一个引用类型,而其他是结构,这是相关的吗?我必须在这里找到一些东西。 (也可能是相关的:如果我删除了T的协方差,那么也会失败。)
我通常不会使用C#所以这对我来说有点陌生。任何解释为什么这不起作用,以及任何指向解决方案的指针都是受欢迎的。
编辑:我实现IMyInterface的内部类传递为type
(typeof)
EDIT2:正如Alireza在下面的答案中解释的那样,使T协变使其不支持值,类型,这解释了为什么T = String
有效,而不是T = ValueType
。我仍然不知道如何才能完成这项工作......
答案 0 :(得分:5)
你放在T前面的out
修饰符使它变得协变,但来自MSDN document for out
:
参考类型支持协方差和逆变,但值类型不支持它们。
更新:有时候(如果您的设计允许它并且您不需要类外的非泛型内容),您可以使用非通用接口来解决问题:
public interface IMyInterface
{ /*non-generic content*/}
public interface IMyInterface<out T> : IMyInterface where T : IConvertible
{/*Contents*/}
internal class MyStringClass : IMyInterface<String> {/*Contents*/}
internal class MySingleClass : IMyInterface<Single> {/*Contents*/}
static IMyInterface CreateMyObject(Type type)
{
return (IMyInterface)Activator.CreateInstance(type);
}