【问题标题】:CS1501: No overload for method 'ToString' takes 0 arguments?CS1501:方法“ToString”没有重载需要 0 个参数?
【发布时间】:2012-08-21 21:00:31
【问题描述】:

没有 ToString 的重载怎么可能接受零参数?零参数 ToString 是 System.Object 的一部分!

编辑以响应接近投票: 由于我无法将构建服务器升级到 .NET 4.5,有什么方法可以使此代码与.NET 4.0/VS 2010 编译器?没有给我的重载一个完全不同的名称,这并不酷。

  • 有问题的对象是一个 F# 可区分联合,它覆盖了从 System.Object 继承的 ToString 方法。
  • C# 项目中的代码正在调用被覆盖的 ToString,该项目属于同一解决方案的一部分。
  • 这一切都很好,直到我向我的可区分联合添加了一个额外的 ToString 重载,这需要一个参数。
  • 这一切都在我的本地机器上完美构建和运行(VS 2012,所有项目都针对 .NET 4.0)
  • 它在构建服务器 (.NET 4.0) 上失败 - 只要我将 ToString 的 1 参数重载添加到我的可区分联合中,标题中就会出现 C# 编译器错误。

我想最简单的解决方法是将我的 ToString 重命名为其他名称,但这很奇怪。

这是一个简单的复制。您可以在此处下载包含此代码的解决方案的 zip 文件:http://dl.dropbox.com/u/1742470/CS1501_Repro.zip

在 VS 2010 中编译该解决方案将失败,并显示“CS1501:方法 'ToString' 没有重载需要 0 个参数”。在 VS 2012 中编译它就可以了。在这两种情况下,我们的目标都是 .NET Framework 4。

F#

namespace CS1501_Repro.FSharp

open System

[<Serializable>]
type MyDiscriminatedUnion =
    | Foo of int list
    | Bar of string
    | Baz of int
    | Fizz of float
    | Buzz of DateTimeOffset

    override this.ToString() =
        "Zero Arguments"

    member this.ToString(lookup:Func<int,string>) =
        "One Argument"

C#

using System;
using CS1501_Repro.FSharp;

namespace CS1501_Repro.CSharp
{
    public class Caller
    {
        private MyDiscriminatedUnion _item;

        public Caller(MyDiscriminatedUnion item)
        {
            _item = item;
        }

        public string DoThing()
        {
            return _item.ToString();
        }

        public string DoOtherThing()
        {
            return _item.ToString(i => i.ToString());
        }
    }
}

【问题讨论】:

  • 请发布一些代码来重现您遇到的问题。
  • 你能用一个简短但完整的例子来重现这个吗(只是 F# 中的一个有区别的联合,C# 代码调用它)?
  • 您是否可以将其称为toString 或类似的名称(一些略有不同的名称)?
  • 我会看看我是否可以进行隔离复制 - 我需要几分钟,因为我需要先修复损坏的构建并在两台机器上测试我的代码以验证我已经复制它。
  • 有趣的是,如果您将 F# 项目转换为 Visual Studio 2012 并在那里构建它,那么 C# 项目能够在 Visual Studio 2010 中成功构建。

标签: c# f#


【解决方案1】:

这只是部分答案,但我注意到 VS2010 和 VS2012 为 F# 类生成不同的 IL。如果你查看ToString(lookup:Func&lt;int,string&gt;)方法的IL,那么你会看到VS2010中的输出是:

.method public instance string  ToString(class [mscorlib]System.Func`2<int32,string> lookup) cil managed
{
  // Code size       7 (0x7)
  .maxstack  3
  IL_0000:  nop
  IL_0001:  ldstr      "One Argument"
  IL_0006:  ret
} // end of method MyDiscriminatedUnion::ToString

而 VS2012 中的输出是:

.method public hidebysig instance string 
        ToString(class [mscorlib]System.Func`2<int32,string> lookup) cil managed
{
  // Code size       7 (0x7)
  .maxstack  8
  IL_0000:  nop
  IL_0001:  ldstr      "One Argument"
  IL_0006:  ret
} // end of method MyDiscriminatedUnion::ToString

区别在于方法签名中的hidebysig注解。如果添加hidebysig,则该方法将隐藏其他具有相同名称和签名的实现(在基类中),而如果省略hidebysig,则即使签名也将隐藏所有其他同名实现是不同的。 This stack overflow question 包含一个描述 hidebysig 的好答案。

所以虽然这个答案不能解决你的问题,但它解释了为什么它不能在 VS2010 中编译。

【讨论】:

  • 感谢hidebysig 提供的信息——这听起来确实是个问题。我想这对我来说是一种解决方法,至少在我获准更新构建服务器上的编译器之前。
【解决方案2】:

我不得不承认,这是我第一次使用 F#,所以这个解决方案可能不是最优雅的,但是,您提到 ToString() 是 System.Object 的一部分...

我通过在 DoThing() 方法中添加一行代码来解决这个问题,该方法将 _item 分配给对象,然后从对象调用 ToString(),在这种情况下,给出了所需的结果:

F# 代码(未更改)

type MyDiscriminatedUnion =
    | Foo of int list
    | Bar of string
    | Baz of int
    | Fizz of float
    | Buzz of DateTimeOffset

    override this.ToString() = "Zero Arguments"
    member this.ToString(lookup:Func<int,string>) = "One Argument"

C# 代码(参见 DoThing() 方法的变化)

    public class Caller
    {
        private Module1.MyDiscriminatedUnion _item;

        public Caller(Module1.MyDiscriminatedUnion item)
        {
            _item = item;
        }

        public string DoThing()
        {
            object result = _item; //assign to object
            return result.ToString(); //call ToString() on object
        }

        public string DoOtherThing()
        {
            return _item.ToString(i => i.ToString());
        }
    }

如果这不是您想要的,我深表歉意……但这是我能想到的,如果有人认为这是错误的做法,请说出原因!

【讨论】:

  • 这是个好主意,投射到对象。随着变通方法的出现,我认为我更喜欢给我的重载一个与 ToString 不同的名称,但这种方法肯定没有错。
  • 演员不是也可以吗? ((object)_item).ToString()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多