2

refオーバーロードされたメソッドのパラメーターに追加しようとすると、エラーが発生するのはなぜですか?

'WindowsFormsApplication1.Form1.SearchProducts(int)'に最適なオーバーロードされたメソッドの一致には、いくつかの無効な引数があります

引数1:'refSystem.Collections.Generic.List'から'int'に変換できません

ここにいくつかの(簡略化された)コードがあります:

public virtual IList<int> SearchProducts(int categoryId)
{
    List<int> categoryIds = new List<int>();
    if (categoryId > 0)
        categoryIds.Add(categoryId);
    return SearchProducts(ref categoryIds);
}

public virtual IList<int> SearchProducts(ref IList<int> categoryIds)
{
    return new List<int>();
}

編集:

この場合になぜ必要なのかと尋ねられた方もいらっしゃいますrefが、リストをクリアして新しい要素を追加できるので(新しい参照を作成する必要がないため)、おそらく必要ないという答えが返ってきます。しかし、問題は私が必要かどうかという事実ではなくref、なぜエラーが発生したかということです。そして、答えが見つからなかったので(しばらくグーグルした後)、質問は面白くて、ここで尋ねる価値があると思いました。良い質問だとは思わず、閉鎖することに投票した方もいらっしゃると思います...

4

3 に答える 3

8

引数を参照で渡す場合、コンパイル時の型はパラメータ型とまったく同じ型である必要があります。

2番目のメソッドが次のように記述されているとします。

public virtual IList<int> SearchProducts(ref IList<int> categoryIds)
{
    categoryIds = new int[10];
    return null;
}

int[]実装として、コンパイルする必要がありますIList<int>ただし、呼び出し元が実際に型の変数を持っていて、現在は...List<int>への参照がある場合、型の安全性が損なわれます。int[]

これは、 -の代わりにcategoryIds呼び出し元のメソッドで宣言された型を作成することで修正できますが、そもそも参照によって引数を実際に渡したくないのではないかと強く思います。そうする必要があることは比較的まれです。C#パラメーターの受け渡しにどの程度満足していますか?IList<int>List<int>

于 2012-08-29T19:50:28.547 に答える
1

次のことを試してください。

public virtual IList<int> SearchProducts(int categoryId)
{
    IList<int> categoryIds = new List<int>();
    if (categoryId > 0)
    categoryIds.Add(categoryId);
    return SearchProducts(ref categoryIds);
}
于 2012-08-29T19:50:31.893 に答える
0

メソッドに割り当て可能なIList(intの)を渡す必要があります。

IList<int> categoryIds = new List<int>();
于 2012-08-29T19:51:58.753 に答える