namespace A { public struct KeyValuePair { public KeyValuePair (X x, Y y) { } } public interface IComparer { int Compare (T x); } public class KeyValuePairComparer : IComparer> { public int Compare (KeyValuePair a) { return 0; } } public class TreeBag { IComparer comparer; public TreeBag (IComparer comparer) { this.comparer = comparer; } public int Find (ref T item) { return comparer.Compare (item); } } public class X { public static void Test () { KeyValuePair pair = new KeyValuePair (3, 89); KeyValuePairComparer comparer = new KeyValuePairComparer (); TreeBag> bag = new TreeBag> (comparer); bag.Find (ref pair); } } } namespace B { public class KeyValuePair { public KeyValuePair (X x, Y y) { } } public interface IComparer { int Compare (T x); } public class KeyValuePairComparer : IComparer> { public int Compare (KeyValuePair a) { return 0; } } public class TreeBag { IComparer comparer; public TreeBag (IComparer comparer) { this.comparer = comparer; } public int Find (ref T item) { return comparer.Compare (item); } } public class X { public static void Test () { KeyValuePair pair = new KeyValuePair (3, 89); KeyValuePairComparer comparer = new KeyValuePairComparer (); TreeBag> bag = new TreeBag> (comparer); bag.Find (ref pair); } } } class X { public static void Main () { A.X.Test (); B.X.Test (); } }