我(尝试)了解仿制药,我认为我理解它们。我有以下泛型类的代码:
/// <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";
现在,我可以在两个Subtract
,int
甚至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>'
代码本身并不是那么重要,因为我只是想了解/学习泛型,所以我只想了解这里有什么问题以及为什么它不起作用......实际的方法并不重要/将不会被使用。
答案 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)