为情况A == B专门实现GenericType <A,B>?

我有一个泛型类,它接受两个类型参数, Generic<A, B> 。 这个类具有独特的签名方法,并且AB是不同的。 但是,如果A == B则签名完全匹配,无法执行重载解析。 有没有可能以某种方式为这种情况指定方法的专门化? 或者强制编译器任意选择一个匹配的重载?

using System;

namespace Test
{
    class Generic<A, B>
    {
        public string Method(A a, B b)
        {
            return a.ToString() + b.ToString();
        }

        public string Method(B b, A a)
        {
            return b.ToString() + a.ToString();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Generic<int, double> t1 = new Generic<int, double>();
            Console.WriteLine(t1.Method(1.23, 1));

            Generic<int, int> t2 = new Generic<int, int>();
// Following line gives:
//     The call is ambiguous between the following methods
//     or properties: 'Test.Generic<A,B>.Method(A, B)' and
//     'Test.Generic<A,B>.Method(B, A)'
            Console.WriteLine(t2.Method(1, 2));   
        }
    }
}

鉴于纯粹的通用定义,无法强制编译器选择重载。 无法区分这两种方法之间的胜利者。

选择一个或另一个似乎是个好主意,但决策需要是确定性的。 即使像文件中第一个那样简单的东西也不是真正可行的,因为您必须考虑部分类。 如果每个文件都在不同的文件中,编译器如何选择第一种方法?

你可以做的是添加接受int的方法的非通用版本。 编译器将在通用版本上选择非通用版本,并在这种非常有限的情况下产生一个胜利。 对于可能有冲突的每种类型,您都必须重复该操作。

例如。 添加此方法将解决您的编译错误,但仅限于int。

public string Method(int b, int a)
{
    return b.ToString() + a.ToString();
}

感谢好的答案,他们促使我进入这个解决方案:

using System;

namespace Test
{
    class Generic<A, B>
    {
        public string Method(A a, B b)
        {
            return this.DefaultMethod(a, b);
        }

        protected string DefaultMethod(A a, B b)
        {
            return a.ToString() + b.ToString();
        }

        public string Method(B b, A a)
        {
            return b.ToString() + a.ToString();
        }
    }

    class Generic<A> : Generic<A, A>
    {
        public new string Method(A a, A b)
        {
            return base.DefaultMethod(a, b);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Generic<int, double> t1 = new Generic<int, double>();
            Console.WriteLine(t1.Method(1.23, 1));

            Generic<int> t2 = new Generic<int>();
            Console.WriteLine(t2.Method(1, 2));
        }
    }
}

我知道这有点违背了泛型的目的,但是如何定义一次方法,需要两个object类型的参数?

在该方法内部,您可以检查类型并确定要调用哪个选项。

namespace Test
{
    class Generic<A, B>
    {
        public string Method(object a, object b)
        {
            if (a is A && b is B)
                return MethodOneTwo;
            else if (a is B && b is A)
                return MethodTwoOne;
            else
                throw new ArgumentException("Invalid Types");
        }

        private string MethodOneTwo(A a, B b)
        {
            return a.ToString() + b.ToString();
        }

        private string MethodTwoOne(B b, A a)
        {
            return b.ToString() + a.ToString();
        }
    }
}
链接地址: http://www.djcxy.com/p/57839.html

上一篇: Specialize implementation of GenericType<A,B> for case A == B?

下一篇: Bidirectional 1 to 1 Dictionary in C#