如何解决C#将结构和数字一起添加到字符串中时,数字不会显示
因此,我开始制作这个名为stringW的结构,并重载并定义了一大堆运算符: 但是,当我尝试在控制台中编写它时,由于某种原因,当存在b时我在字符串中添加3时,最后的3不会出现。我搞砸了吗?我不是类/结构方面的专家,但是我没有看到类似的东西。这是代码:
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结构转换为字符串,该运算符返回不带3的字符串,并调用第二个重载。
通常,您不应该使用隐式运算符来使您丢失信息。例如,myInt = (int)myLong
必须是显式的,因为您可能会丢失更高位的信息,而myLong = myInt
可以被隐式化,因为您不会丢失信息。
如果将stringW转换为字符串,则会丢失权重值。因此,建议使其明确。
另一个说明,不要命名结构String
的属性。这不仅是现有类型System.String
的名称,还是最常用的类型之一。因此,我建议使用其他名称,以免引起人们阅读您的代码的困惑。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。