【问题标题】:C# 7.0 Overloads and the new tuple return syntaxC# 7.0 重载和新的元组返回语法
【发布时间】:2018-09-28 13:12:30
【问题描述】:

关于使用新的 C# 7.0 元组语法的方法重载的快速问题。

我创建了两个函数重载。简而言之,它们大致如下:

public Boolean TheFunction( string p_in_value )
    { 
    ... 
    return true;
    }

public ( Boolean Result, long SomeID ) TheFunction( string p_in_value )
    {
    ...
    return ( true, _found_id );
    }

现在,我会争辩说,因为他们各自的电话会采用以下形式

_my_bool = TheFunction( "" );

( _my_bool, _my_long ) = TheFunction( "" );

编译器应该能够区分两者,从而满足创建重载时需要能够确定要调用哪个版本的基本要求。

现在,我在另一个问题中读到,最近在 C# 3.0 中,方法的签名不包括其返回类型,但肯定不再适用,因为我在其他地方有没有问题的函数:

public long ReadHive(string p_section, string p_setting, long p_default) {...}
public bool ReadHive(string p_section, string p_setting, bool p_default) {...}

尽管如此,我收到了语法错误“'Program' 已经定义了一个名为 'TheFunction' 的成员具有相同的参数类型”。

因此,除非我只是看错了东西,否则似乎使用这种新的元组返回语法,返回类型在区分一个版本和另一个版本方面没有任何作用,这看起来有点短视。

所以,我的问题是——我看错了东西,这应该是可能的,还是我运气不好,新语法在这方面不够用?还是我更错了,我的“TheFunction”方法的处理方式与“ReadHive”方法的处理方式之间存在一些根本区别?

【问题讨论】:

  • 这不是语言/编译器的设计方式。
  • 你的ReadHive方法不一样。

标签: c# methods syntax tuples overloading


【解决方案1】:

C# 不允许方法仅因返回类型而不同。所以你提议的东西一开始就不会编译。

在实现隐式转换时,只有一个例外:

class Foo
{
    public static implicit operator int(Foo f)
    {
        return 1;
    }

    public static implicit operator bool(Foo f)
    {
        return true;
    }
}

编译器创建的 op_implicit 方法仅在返回类型上有所不同,如下所示:

但这对你的情况没有用。

【讨论】:

    【解决方案2】:

    在您添加的示例中:

    public long ReadHive(string p_section, string p_setting, long p_default) {...}
    public bool ReadHive(string p_section, string p_setting, bool p_default) {...}
    

    功能因参数而异 - 第三个参数是 long 与 bool。

    你不能仅仅通过返回类型来区分函数:(

    【讨论】:

      【解决方案3】:

      在我的匆忙中,我确实错过了参数列表之间的根本区别。很抱歉浪费了您的时间。谢谢大家的帮助——你们是最棒的!太糟糕了,不能将返回类型作为识别信息的一部分,即使“https://docs.microsoft.com/en-us/dotnet/csharp/methods”确实声明了“返回值,如果方法没有返回值,则为无效”。是签名的一部分。也许这并不意味着我认为它意味着什么。再次感谢大家,很抱歉错过了显而易见的事情。也许在我通过第二个月的 C# 编程之后,我会变得更好......

      【讨论】:

        猜你喜欢
        • 2017-04-11
        • 2013-01-25
        • 2018-05-30
        • 2018-01-27
        • 2017-08-10
        • 2018-03-08
        • 1970-01-01
        • 2020-03-11
        • 2012-06-26
        相关资源
        最近更新 更多