5

ライブラリにこのようなメソッドがあります

public void Foo<T>(IQueryable<T> input)
{
    //T is never used and the code compiles when I remove T
} 

それをリファクタリングして、ジェネリック パラメータを削除したいと思います。

public void Foo(IQueryable input) { ... }

ライブラリに依存するコードにどのような影響がありますか? 彼らは再構築を行う必要がありますか?
コンパイル エラーが発生しますか?
リフレクションを使用してこのメ​​ソッドを呼び出した場合はどうなるでしょうか。

両方を作成すると、メソッド解決は常に一般的なものを選択します。後のバージョンで一般的なものを非推奨にして廃止するにはどうすればよいですか?

4

1 に答える 1

3

Foo<T>()Foo`1コンパイルされたコードで呼び出されます。したがって、コンパイルされたコードでFoo()呼び出されたものと同じではありません。Foo

あなたの質問に基づいて、これはパブリック API にあり、下位互換性が必要です。私だったら、次のように変更します。

[Obsolete("Call Foo2() instead of the deprecated Foo()", true)]
public void Foo<T>(IQueryable<T> input)
{
    Foo2(input);
}

public void Foo2(IQueryable input)
{
...
}

この新しいバージョンに対してコンパイルされたものは、古い方法を使用すると文句を言います。これは、社内コードとサード パーティ コードの両方に当てはまります。そのため、エラー メッセージに次に何をすべきかの説明を含めます。

于 2016-06-26T15:03:03.577 に答える