(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
,而且是最常用的类型之一。所以我建议使用另一个名称,以避免混淆阅读您的代码的人。
所以,我开始制作这个名为 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
,而且是最常用的类型之一。所以我建议使用另一个名称,以避免混淆阅读您的代码的人。