【问题标题】:C# Operator Overloading, rewriting string?C#运算符重载,重写字符串?
【发布时间】:2016-03-28 14:21:30
【问题描述】:

我对 C# 很陌生 目前正在学习运算符重载 我正在尝试做这样的事情:

string val = 500; (I can't implicitly)

然后

Number n1 = val;

我设法得到Number n1 = someintvalue,例如:

Number n1 = 500;

像这样:

public struct Number
{
    public int Value { get; set; }
    public Number(int Val)
    {
        Value = Val;
    }
    public static implicit operator Number(int num)
    {
        return new Number(num);
    }
}

但是,当尝试使 Number n1 = val; (当 val 是一个字符串时) 由于第一行无法编译,我根本无法编译:

string val = 500;

以下将不起作用:

public static implicit operator string(int A)
{
    return new string(A);
}

因为 1 个我无法理解的错误
1)用户定义的转换必须与封闭类型相互转换

顺便说一下,我得到了操作重载的想法
在这种特定情况下:return new Number(num); 我只是初始化ctor
还需要一些更基本的了解 提前谢谢!

【问题讨论】:

  • 旁注:不要使用struct,除非您了解它和class 之间的区别,并且明确需要struct。可变结构会导致各种通常不必要的问题。
  • 另外,string val = 500; 是不好的做法。如果你想要一个字符串,那么使用一个字符串string val = "500"; C# 是一种强类型语言,应该这样对待 - 添加多个类型转换重载会破坏类型安全。

标签: c# string operator-overloading overloading operator-keyword


【解决方案1】:

我认为您引用的函数在 Number 类中。您在该类中添加了一个从 intstring 的转换运算符,这是不合法的。您只能添加与定义类型相互转换的运算符,例如:

public static implicit operator string(Number A)
{
    return new string(A.Value);
}

这将失败,因为string 没有采用int 的构造函数。你可以这样做:

public static implicit operator string(Number A)
{
    return A.ToString();
}

但是“转换”为字符串的标准方法是重载ToString 方法,当请求转换为字符串时,编译器通常会自动调用该方法:

public override string ToString()
{
    return Value.ToString();
}

【讨论】:

  • 我明白你在这里所做的。但是,我不明白如何使字符串 val = 500;在虚空 Main
  • 500 是一个整数,而不是一个字符串。没有从intstring 的隐式转换,因此您需要string val = "500"; 或字符串val = 500.ToString();。 C# 是一种类型安全的语言。不要尝试像 JavaScript 一样使用它。
猜你喜欢
  • 1970-01-01
  • 2015-11-12
  • 2017-11-04
  • 2012-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多