ToString のオーバーロードがゼロの引数を取ることができるのはどうしてですか? 引数なしの ToString は System.Object の一部です!
クローズ投票に応じて編集: ビルド サーバーを .NET 4.5 にアップグレードする立場にないので、このコードを .NET 4.0/VS 2010 コンパイラで動作させる方法はありますか? オーバーロードにまったく別の名前を付けることはできませんが、これはクールではありません。
- 問題のオブジェクトは、System.Object から継承された ToString メソッドをオーバーライドする F# Discriminated Union です。
- オーバーライドされた ToString は、同じソリューションの一部である C# プロジェクトのコードによって呼び出されています。
- ToString の余分なオーバーロードを識別された共用体に追加するまで、これはすべて正常に機能しました。これは 1 つの引数を取ります。
- すべてが私のローカル マシン上で完全にビルドおよび実行されます (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());
}
}
}