为什么我不能从通用对象运行以下方法?

时间:2011-02-21 12:46:55

标签: c# generics syntax

我(尝试)了解仿制药,我认为我理解它们。我有以下泛型类的代码:

    /// <summary>
    /// generics
    /// </summary>
    class Point<T> where T : IConvertible
    {
        public T X;


        NumberFormatInfo nf = NumberFormatInfo.CurrentInfo;

        public double Subtract(Point<T> pt)
        {
            return (X.ToDouble(nf) + pt.X.ToDouble(nf));
        }

    }

Main()中,我可以创建对象:

        Point<int> pt = new Point<int>();
        Point<double> pt2 = new Point<double>();
        Point<string> pt3 = new Point<string>();

        pt.X = 10;

        pt2.X = 10;

        pt3.X = "10";

现在,我可以在两个Subtractint甚至double上运行string方法,但是我无法运行混合,我以为我能够进行.ToDouble转换。

如果我尝试运行Console.WriteLine(pt.Subtract(pt2));,我会收到以下错误:

Error   1   The best overloaded method match for Date.Point<int>.Subtract(Date.Point<int>)' has some invalid arguments

Error   2   Argument 1: cannot convert from 'Date.Point<double>' to 'Date.Point<int>'   

代码本身并不是那么重要,因为我只是想了解/学习泛型,所以我只想了解这里有什么问题以及为什么它不起作用......实际的方法并不重要/将不会被使用。

3 个答案:

答案 0 :(得分:6)

您的Subtract方法需要Point<T> T这是您的类的类型参数,这意味着它只能采用相同类型的Point

您需要为Subtract提供一个单独的通用参数,以便Point<U>可以使用U

答案 1 :(得分:1)

T中的类型必须与类声明和方法中的相同:

class Point<T> where T : IConvertible
{
    public double Subtract(Point<T> pt)

您可以引入第二个通用参数:

class Point<T> where T : IConvertible
{
    public double Subtract<T2>(Point<T2> pt) where T2 : IConvertible

答案 2 :(得分:1)

您的方法签名:

public double Subtract(Point<T> pt)

要求Point泛型类型T,它与类定义中的泛型类型匹配:

class Point<T> where T : IConvertible

这意味着它要求的是同一类型。

您可以指定不同的泛型类型,以允许它混合使用不同的类型:

public double Subtract<U>(Point<U> pt) where U : IConvertible
{
    return (X.ToDouble(nf) + pt.X.ToDouble(nf));
}

但请注意,由于U的实际类型可以从您传递的Point<U>参数中推断出来,因此您可以以相同的方式调用方法,而无需指定类型:

Console.WriteLine(pt.Subtract(pt2)); // As opposed to pt.Subtract<double>(pt2)