为什么会收到警告,无法将一种类型转换为另一种类型?

时间:2019-12-26 11:57:43

标签: c#

我有这种方法:

public TYPE GetObjBy<TYPE>() where TYPE : BaseConfiguration
{
  Type type = typeof(TYPE);

  if (type == typeof(MCConfiguration))
  {
    return (TYPE) new MCConfiguration(); <--- This line I get an error
  }

  return (TYPE) new BaseConfiguration(); <-- This line is OK
}

MCConfigurationBaseConfiguration扩展而来,但是在一行中我得到一个错误,而在另一行中却没有。这怎么可能?

编辑

使用

ConfigurationParser par = new ConfigurationParser("");
MCConfiguration config = par.GetObjBy<MCConfiguration>();

编辑

        public TYPE GetObjBy<TYPE>() where TYPE : BaseConfiguration, new()
        {
            Type type = typeof(TYPE);
            BaseConfiguration config;

            if (type == typeof(MCConfiguration))
            {
                config = new MCConfiguration();
            }
            else
            {
                config = default(TYPE);
            }

            return (TYPE)config;
        }

1 个答案:

答案 0 :(得分:1)

您会收到此错误,因为GetObjBy<>方法可以与从BaseConfiguration派生的任何类型一起使用:

class MappingSchemaTest : BaseConfiguration
{}

class MappingSchemaTestImpl : BaseConfiguration
{
    T GetObjBy<T>() where T : BaseConfiguration
    {
        return new MappingSchemaTestImpl();
    }

    void Use()
    {
        var t = GetObjBy<MappingSchemaTest>();
    }
}

MappingSchemaTestMappingSchemaTestImpl均来自BaseConfiguration

但是由于return new MappingSchemaTestImpl();通用参数与MappingSchemaTest不同,所以无法返回MappingSchemaTestImpl

PS在通用参数上添加new()约束并像这样写

    T GetObjBy<T>() where T : BaseConfiguration, new()
    {
        return new T();
    }

PPS的另一种选择是不返回泛型,而是返回基类或接口,例如

    BaseConfiguration GetObjBy<T>() where T : BaseConfiguration
    {
        if (true)
                return new MCConfiguration();
        else
                return new MCConfiguration2();
    }