【发布时间】: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 中成功构建。