1

簡単なカンマ区切りの文字列を作成するために使用する簡単なヘルパー クラスがあります。

private string AddcsvString(string s)
{
    if(string.IsNullOrWhiteSpace(this.Value))
    {
        return s;
    }
    else
    {
        return this.Value + "," + s;
    }
}

これを呼び出すジェネリックメソッドもあります

public void Add<T>(T s) where T: struct 
{
     this.Value = AddcsvString(s.ToString());
}

ジェネリック List のオーバーロードを追加したかった

public void Add<T>(IEnumerable<T> values)where T:struct 
{
    foreach (T t in values)
    {
        Add(t.ToString());
    }
}

しかし、これを呼び出そうとすると、最初のジェネリック メソッドが呼び出されます。そこで、2 番目のジェネリック メソッドの名前を AddAll に変更しました。最終的には、これがこのケースの正しい方法だったと思いますが、将来の参考のために両方を持つことが可能かどうかを知りたい.

--edit これはうまくいかないケースです

CsvString test = new CsvString();
string result;
test.Add(1);
test.Add('2');
test.Add("3");
result = test.ToString();  //  result = "1,2,3"

CsvString test2 = new CsvString();
List<long> aList = new List<long>();
string result2;
aList.Add(1);
aList.Add(2);
aList.Add(3);
test2.Add(aList);  //line doesn't compile

--edit 2 2 番目の解決策を見つけました (ただし、以下の JoshE はこれに回答した功績を認められていますが、ところで感謝します)。2番目の方法をこれに変更しました

public SWcsvString Add<T,K>(T values)where T: IEnumerable<K> where K: struct
{
    foreach (K k in values)
    {
        Add(k.ToString());
    }
    return this;
}

そしてこれへの呼び出し

test2.Add<IEnumerable<long>,long>(aList);
4

1 に答える 1

1

制約where T : structを削除してみてください。適切な動作が得られると思います。

IEnumerable<char> <==> String、 astringは単なる a であるためchar[]。astring実際には値オブジェクトではないため、オーバーロードの解決では、文字列を に変換するボックス化/ボックス化解除操作を回避するために、ほとんどの場合、最初のメソッドが優先されIEnumerable<char>ます。(私はあなたが両方でそれを呼び出そうとしたと推測しています"foo"IEnumerable<bar>wherebarは構造体です)。

于 2013-03-22T16:46:35.247 に答える