C#是否可以重写派生类上的返回类型?

C#是否可以重写派生类上的返回类型?,c#,inheritance,overriding,C#,Inheritance,Overriding,在我的大多数派生类中,它是一致的,但其中一个我想返回一个自定义类类型,这可能吗?简短的回答是否定的 想一想,以后怎么用 class base{ .... public string name(); .... } class deriveda : base{ .... public override string name(); .... } class derivedb : base{ .... public override

在我的大多数派生类中,它是一致的,但其中一个我想返回一个自定义类类型,这可能吗?

简短的回答是否定的

想一想,以后怎么用

class base{
    ....
    public string name();
    ....
}

class deriveda : base{
    ....
    public override string name();
    ....
}

class derivedb : base{
    ....
    public override string name();
    ....
}

class derivedc : base{
    ....
    public override foo name();
    ....
}
然后呢?
b.name()
的返回类型是什么<代码>字符串<代码>foo

但是,您可以使用泛型来控制它(尽管我不确定它是否适合您的用例):

类基{
....
公共虚拟T名称();
....
}
派生类:基{
....
公共重写字符串名称();
....
}
B类:基{
....
公共重写字符串名称();
....
}
类derivedc:基{
....
公共覆盖foo name();
....
}

,这是不可能的。正如其他人指出的,编译器无法区分仅在返回类型上不同的函数(因为返回类型不是函数签名的一部分)

一种解决方法(在您的情况下可能不起作用)是将返回类型设置为基类函数返回类型的子类,如下所述。但是,foo不能从string派生,因为string是一个密封类。从诸如string之类的预定义类型派生最接近的方法是定义一个string扩展方法,如图所示


Ofir的答案可能是您的最佳选择,但这可能会给您带来其他想法。

在c#9中,这应该是可能的,只要新类型满足协方差规则,特别是更派生的引用类型。它会正常工作。

您可能会遇到“返回类型必须匹配”错误,对吗?这就是你的答案。返回类型不是方法签名的一部分,因此重载在这里不起作用。编译器如何在
var x=o.name()上进行重载解析
?@Tim(参考:已删除的注释),在
public int a()
public long a()之间没有签名差异。签名是
A()
。如果同时定义这两个,编译器将不知道要调用哪个,因此代码无法编译。@tim方法签名由方法名及其参数组成。返回类型不是它的一部分。对不起,我不知道这一点。考虑到在大多数其他语言中,返回类型是签名的一部分,这不是一个完全不合理的假设。否则,从一般意义上讲,这段代码是有效的,不知道提问者的具体情况。这太好了!!
base b = new derivedc ()
class base<T>{
    ....
    public virtual T name();
    ....
}

class deriveda : base<string>{
    ....
    public override string name();
    ....
}

class derivedb : base<string>{
    ....
    public override string name();
    ....
}

class derivedc : base<foo>{
    ....
    public override foo name();
    ....
}