私の質問の重点は、C# Genericsと、インターフェイスIXListまたはIYListをこの「GetAllValues ()」メソッドに渡すことです。目標は、GetAllValues<IXList>()
-Or-を呼び出すための共通コードですGetAllValues<IYList>()
。
09-21-13 フォローアップ: 私は次のことを学びました: where Z : IXList, IYList
Z が型であることを意味しIXList
、ITList
- この理解があれば試してみるかもしれませんwhere Z : class
が、これはせいぜいまだ機能しない横方向のステップであり、Z.anything
...anything
が見つからないため、コンパイラはZ
...について無知です
渡された Z の実際の型をテストしてから、条件付き実行時コードで正しいキャストlist
を選択して、それに応じて .Head()、.Get()、および .Next() を呼び出すことはできますか? 例: ((IXList)list).Head();
-または- ((IYList)list).Head();
[[ はい、可能です。2013 年 9 月 24 日のコードの下にある 2 番目の回答を参照してください。]]
09-29-13 フォローアップ: そして最後に、以下に投稿された回答/解決策#3は、最終的な解決策をよりオブジェクト指向のものに移行します。したがって、この 3 番目の解決策は、ジェネリックの型を尋ねる方法と、最初に発生したコンパイラのあいまいなエラーを解決する方法に関する私の最初の質問を意味のないものにします。[[09-29-13 日付の下のコードで、回答/解決策 #3 を参照してください。]]
internal static IEnumerable<int> GetAllValues<Z>(Z list)
where Z : IXList, IYList
{
try
{
list.Head(); // Error 344 - The call is ambiguous between the following
// methods or properties: 'IXList.Head()' and 'IYList.Head()'
}
catch (Exception)
{
yield break;
}
do
{
IntPtr lineItemPointer;
int x = list.Get(); // Error 345 - The call is ambiguous between the following
// methods or properties: 'IXList.Get()' and 'IYList.Get()'
yield return x;
try
{
list.Next(); // Error 346 -The call is ambiguous between the following
// methods or properties: 'IXList.Next()' and 'IYList.Next()'
}
catch (Exception)
{
yield break;
}
} while (true);
}