无法转换类型' MyType'输入' IMyInterface`1 [System.IConvertible]'

时间:2014-07-15 09:34:58

标签: c#

我将实现类转换为通用接口时遇到问题。 我在一个实现此接口的类中有几个内部类。 然后我有一个方法应该返回这些类中的任何一个,但它包含的强制转换失败了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。我仍然不知道如何才能完成这项工作......

1 个答案:

答案 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);
}