使用转换方法重写类型中的虚拟方法
本文关键字:虚拟 方法 类型 转换方法 重写 | 更新日期: 2023-09-27 18:31:27
当我写Console.WriteLine( new Point (1,1));
时,它不会调用方法ToString
。但它将对象转换为Int32
,并将其写入控制台。但是为什么?似乎它忽略了覆盖的方法ToString
.
struct Point
{
public Int32 x;
public Int32 y;
public Point(Int32 x1,Int32 y1)
{
x = x1;
y = y1;
}
public static Point operator +(Point p1, Point p2)
{
return new Point(p1.x + p2.x, p1.y + p2.y);
}
public static implicit operator Int32(Point p)
{
Console.WriteLine("Converted to Int32");
return p.y + p.x;
}
public override string ToString()
{
return String.Format("x = {0} | y = {1}", x, y);
}
}
原因是由于隐式转换为Int32
(您可能知道)。
Console.WriteLine
有许多重载,需要String
、Object
和其他包括Int32
由于Point
是隐式可转换为Int32
因此使用了Console.WriteLine
的int
重载,这也执行了隐式强制转换。
这可以通过以下方式修复:
Console.WriteLine(new Point(1, 1).ToString());
Console.WriteLine((object)new Point(1, 1));
可以在 C# 中的重载分辨率中找到有关它的详细信息。
否则,最佳函数成员是一个函数成员 相对于给定的函数成员,优于所有其他函数成员 参数列表,前提是将每个函数成员与所有函数成员进行比较 使用第 7.4.2.2 节中的规则的其他函数成员。
其中还有:
7.4.2.2 更好的功能成员
对于每个参数,从 AX 到 PX 的隐式转换不是 比从 AX 到 QX 的隐式转换更糟糕,并且
这是因为结构类型中的隐式转换,即以下行:
public static implicit operator Int32(Point p)
{
Console.WriteLine("Converted to Int32");
return p.y + p.x;
}
因此,编译器通过调用上述隐式转换方法将您的 Point 类型视为整数。
要解决此问题,您需要从类型中删除隐式转换,或者在执行 Console.WriteLine() 时放置 ToString() 方法。
这应该可以解决您的问题。希望这有帮助。
最好