我有这种方法:
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
}
MCConfiguration
从BaseConfiguration
扩展而来,但是在一行中我得到一个错误,而在另一行中却没有。这怎么可能?
编辑
使用
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;
}
答案 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>();
}
}
MappingSchemaTest
和MappingSchemaTestImpl
均来自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();
}