当前位置: 首页 > 知识库问答 >
问题:

C#[duplicate]中按返回类型重载函数

蒋永宁
2023-03-14

我目前正在学习C#,有人告诉我,可以使用explicit关键字重载方法返回类型,但他从未解释过如何重载。我搜索了所有地方,也阅读了一些关于stackoverflow的问题和答案,但我没有发现这样的事情,而且,在大多数情况下,回答的人说不可能通过返回类型重载方法。在这一切之后,我开始认为没有这种可能性。现在有人真的知道如何通过使用explicit关键字来重载方法返回类型了吗?或者这是可能的吗?先谢谢你。

共有2个答案

龚勇锐
2023-03-14

我认为你不能在返回类型上超载。返回类型不包括在方法签名中。编译器在检查返回值是否会在更大的上下文中导致错误(如果实际使用返回值)之前确定重载。

如果不使用返回值会发生什么。编译器将不知道使用什么重载。下面是一个这样的例子。

string func(int i){return "";}
int func(int i){return 0;}

void main(){
    func(1);//what happens here??? which method gets called??
} 
燕禄
2023-03-14

不能按返回类型加载。但是,您可以定义多个只因返回类型不同而不同的方法。这是两件不同的事情,常常是错误的。

显式关键字仅涉及运算符。我想这不是他的意思,你们中的一个也可能误用/误解了实际的术语。

他的意思可能是显式接口实现

这是唯一允许定义许多只因返回类型不同而不同的普通方法的方法(可能除了转换运算符,但它们有些特殊)。最常见的是GetEnumerator,这是IEnumerableIEnumerable都需要的

public class Foo : IEnumerable<Bar>, IEnumerable
{
    public IEnumerator<Bar> GetEnumerator() { return null; }

    // IEnumerator GetEnumerator() { return null; } // IMPOSSIBLE

    IEnumerator IEnumerable.GetEnumerator() { return null; }
}

请注意类Foo如何定义返回泛型迭代器的Get枚举器。通常情况下,现在不可能定义另一个将满足经典IENumatble的Get枚举器。

然而,通过最后一行,通过显式接口实现,这是可能的。请注意方法名称是如何以接口名称作为前缀的。

另外,要小心:所有显式实现都是私有的,这就是为什么它没有访问说明符的原因。这意味着,尽管成功地定义了它们,但您将无法在此基础上过载。除非将Foo转换为普通的IEnumerable,否则显式的一个将始终隐藏,并且永远不会使用。

所以:

Foo foo = ...; // 
foo.GetEnumerator();   // calls normal typed GetEnumerator<>
((IEnumerable)foo).GetEnumerator();   // calls untyped GetEnumerator

警告:该规则也存在于班级的主体中,有时可能会产生误导:

public class Foo : IEnumerable<Bar>, IEnumerable
{
    public IEnumerator<Bar> GetEnumerator() { return null; }

    private void test()
    {
        // relatively obvious:

        this.GetEnumerator(); // calls GetEnumerator<>() !
        ((IEnumerable)this).GetEnumerator(); // calls plain GetEnumerator()
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        // very inobvious:

        return this.GetEnumerator(); // calls GetEnumerator<> ! no recursion!!

        // ((IEnumerable)this).GetEnumerator(); // would call itself recursively
    }
}

 类似资料:
  • 我有一个匿名函数,如下所示: 我想指定cb必须返回一个布尔值,但我是一个打字稿新手,不知道我是否可以(或者即使我这样做或不这样做会对解析器产生影响)。 我该怎么做?

  • 我正在学习如何获取重载函数vs的返回值的。 我修改了SO答案中的代码(由chris编写)。 我有一个编译错误。 错误:“std::result\u of”中没有名为“type”的类型 据我所知:- >

  • 有以下功能: 为了更准确,我使用Java中的泛型类型定义了返回的,即,但它不起作用,出现错误: 类型对象不可下标 问:是否有可能定义返回的与泛型类型?

  • 问题内容: 为什么仅通过更改返回类型就不可能重载函数?将来的Java版本会改变吗? 顺便说一句,仅供参考,这在C ++中可能吗? 问题答案: 你无法在Java中做到这一点,也无法在C ++中做到这一点。基本原理是,仅返回值不足以使编译器确定要调用的函数:

  • 问题内容: 我有一个模块分开的应用程序。有几个实体和CSV模块。CSV模块仅支持struct(Entity),但我想使CSV模块可与任何类型的实体一起使用。现在,它的工作方式如下:Csv模块从通道接收数据并将其严格转换为struct。我如何实现动态返回类型,因此它可以与任何类型的Entity一起使用,而不仅限于 问题答案: 快速/肮脏的解决方案: 返回接口{},但是您最终欺骗了编译器,而类型检查的