使用转换方法重写类型中的虚拟方法

本文关键字:虚拟 方法 类型 转换方法 重写 | 更新日期: 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有许多重载,需要StringObject和其他包括Int32

由于Point是隐式可转换为Int32因此使用了Console.WriteLineint重载,这也执行了隐式强制转换。

这可以通过以下方式修复:

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() 方法。

这应该可以解决您的问题。希望这有帮助。

最好