(C#) 将结构和数字一起添加到字符串中时,数字不显示

(C#) When adding a struct and a number together into a string, the number doesn't show up

所以,我开始制作这个名为 stringW 的结构,并重载并定义了一堆运算符: 但是,当我尝试在控制台中编写它时,出于某种原因,当我在 b 存在时将 3 添加到字符串中时,最后的三个不会出现。我搞砸了什么吗?我不是 classes/structs 方面的专家,但我没有看到这样的事情。这是代码:

public struct stringW
{
    public string String;
    public float Weight;

    public stringW(string _String, float _Weight)
    {
        String = _String;
        Weight = _Weight;
    }


    public static implicit operator string(stringW StringW)
    {
        return StringW.String;
    }

    public static implicit operator stringW(string String)
    {
        return new stringW(String, 0);
    }

    public static explicit operator float(stringW StringW)
    {
        return StringW.Weight;
    }

    public static bool operator ==(stringW left, stringW right)
    {
        return left.String == right.String && left.Weight == right.Weight;
    }
    public static bool operator !=(stringW left, stringW right)
    {
        return left.String != right.String || left.Weight != right.Weight;
    }

    public override string ToString()
    {
        return "{" + String + ", " + Weight.ToString() + "}";
    }
    public string ToString(int digits)
    {
        return "{" + String + ", " + Math.Round(Weight, digits).ToString() + "}";
    }

    public static stringW operator +(stringW left, string right)
    {
        left.String += right;
        return left;
    }
    public static stringW operator +(stringW left, float right)
    {
        left.Weight += right;
        return left;
    }

}

static void Main(string[] args)
{
    string a = "test1";
    stringW b = "test2";
    b.Weight = 1;

    Console.WriteLine(a + " " + b + " Three: " + 3);
    Console.WriteLine(a + " " + " Three: " + 3);
    Console.WriteLine("{0} {1} Three: {2}", a, b, 3);


    Console.ReadKey();
}

这是控制台输出:

test1 test2 Three:
test1  Three: 3
test1 {test2, 1} Three: 3

这是因为你有一个隐式运算符字符串

Console.WriteLine 有很多重载,我在这里感兴趣的是:

public static void WriteLine(object value);
public static void WriteLine(string value);

您希望 C# 使用第一个(带有对象参数)并调用您的 .ToString 并打印 3.

实际发生的是,C# 使用隐式运算符将您的 stringW 结构转换为字符串,returns 一个不带 3 的字符串。并调用第二个重载。

通常情况下,您不应创建导致您丢失信息的隐式运算符。例如 myInt = (int)myLong 必须是显式的,因为您可能会丢失更高位的信息,但是 myLong = myInt 可以是隐式的,因为您不会丢失信息。

在 stringW 到 string 的情况下,您失去了权重值。所以建议明示。

另外注意,不要命名结构 String 的 属性。这不仅是现有类型的名称 System.String,而且是最常用的类型之一。所以我建议使用另一个名称,以避免混淆阅读您的代码的人。