Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从C中的方法返回泛型类的实例#_C#_Generics - Fatal编程技术网

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>'