18

ジェネリック型の制約のみが異なるオーバーロードされたメソッドを持つことはできますか?

これはコンパイルされません:

    void Foo<T>(T bar) where T : class
    {

    }

    void Foo<T>(T bar) where T : struct
    {

    }

これらは「オープン」メソッドであるため、具体的に型指定Tされた .

明白な解決策はそれらを過負荷にしないことですが、なぜこれが C# で機能しないのだろうか?

追加の質問: これが単なる C# コンパイラの制約である場合、IL はそのようなオーバーロードを許可しますか?

4

4 に答える 4

11

ジェネリック型の制約のみが異なるオーバーロードされたメソッドを持つことはできますか?

いいえ。戻り値の型がそうでないのと同様に、オーバーロードに関してはメソッド シグネチャの一部ではありません。

場合によっては、「疑似オーバーロード」の恐ろしい方法がありますが、その道を進むことはお勧めしません。

詳細については、以下を参照してください。

于 2012-09-21T11:53:09.613 に答える
5

これは不可能です。

ジェネリック制約は、オーバーロードの目的でメソッド シグネチャの一部とは見なされません。

値型と参照型の両方を許可したい場合、なぜ制限する必要があるのでしょうか?

于 2012-09-21T11:53:17.587 に答える