C# 从C中的方法返回泛型类的实例#
我有一个模板类:C# 从C中的方法返回泛型类的实例#,c#,generics,C#,Generics,我有一个模板类: public abstract class Base<T> where T : IConvertible {} 但我有错误: Cannot implicitly convert type 'Der1' to 'Base<T>' Cannot implicitly convert type 'Der2' to 'Base<T>' 无法将类型“Der1”隐式转换为“Base” 无法将类型“Der2”隐式转换为“Base” 铸造也无济于事。它
public abstract class Base<T> where T : IConvertible {}
但我有错误:
Cannot implicitly convert type 'Der1' to 'Base<T>'
Cannot implicitly convert type 'Der2' to 'Base<T>'
无法将类型“Der1”隐式转换为“Base”
无法将类型“Der2”隐式转换为“Base”
铸造也无济于事。它返回相同的错误,只是没有“隐式”这个词
有没有一种方法可以简单地做我想做的事情,或者我必须找到其他更费力的方法
提前感谢您的帮助。如果您创建了一个非泛型的附加
Base
类,那么您可以从中继承Base
公共抽象类基类{}
公共抽象类基类:基类,其中T:IConvertible{}
然后,您的方法变成:
private Base GetDer()
{
如果(条件)
返回新的Der1();
返回新的Der2();
}
这是关于在继承层次结构中查找或添加公共祖先(不是对象
…)。当然,这样会丢失信息,因为调用GetDer()
时会丢失类型信息
- 如果您希望稍后对返回的对象调用的方法不需要
的值,那么您应该将这些方法从T
向上移动到Base
类,以便您仍然可以使用它们Base
- 如果您希望调用的方法需要定义的
,那么除了在运行时使用一些反射来推断T
的类型,或者使用T
关键字来绕过编译时检查之外,我看不到其他方法:动态
公共抽象类Base:Base,其中T:IConvertible{
抽象void MethodFromBaseT();
}
...
动态myObject=GetDer();
myObject.MethodFromBaseT()//编译
请注意,您必须使用
dynamic
,因为返回的类型基本上是未知的,因为正如注释中所述,两个不同的Base
和不同的T
是两个不同的类型,它们彼此不继承。返回新的Der1()作为基
/返回(基本)新的Der1()
因此它实际上是GetDer
,并且您希望在T
为Vals1
或Vals2
时使用特殊情况?这是可能的,但是:有什么特别的原因吗?当T
是int
或string
时,GetDer
应该做什么?(我的意思是:不是你处理的事情之一)?如果您需要硬编码每个T
,它可能不应该是泛型的Vals1
和Vals2
基本上是两种不同的类型,因此base您没有模板类,您有一个泛型类。我承认有点吹毛求疵,但这两件事是完全不同的。可能这就是您的困惑所在。@gerryc.inc我认为该方法应该是泛型的GetDer()
;否则,其中T:IConvertible
就没有意义了
private Base<T> GetDer() where T : IConvertible
{
if (condition)
return new Der1();
return new Der2();
}
Cannot implicitly convert type 'Der1' to 'Base<T>'
Cannot implicitly convert type 'Der2' to 'Base<T>'