【问题标题】:Implicit operator for int?int 的隐式运算符?
【发布时间】:2013-07-22 10:42:25
【问题描述】:

我已经学会在我的类中使用隐式运算符。

现在我想做这样的事情:

public static implicit operator string(int val)
{
    return "The value is: " + val.ToString(); // just an nonsense example
}

但是这是错误的。编译器说:

用户定义的转换必须与封闭类型相互转换

我该如何解决这个问题?

我的目标是能够运行这样的代码:

int x = 50;
textbox1.Text = x; // without using .ToString() or casting

【问题讨论】:

  • 为什么会这样?在我看来这是完全正确的!
  • @RomanoZumbé 我更新了我的问题。当我尝试这个时,编译器说“用户定义的转换必须转换为封闭类型”
  • 您无法解决此问题,因为您必须将隐式运算符实现为正在转换的类中的静态方法 - 当然,您无法更改 System. Int32 的实现。
  • 这是一个糟糕的目标。不要尝试编写这样的代码。人们对关闭 option strict 的 VB.NET 编码人员感到不满是有原因的。
  • @J...我会考虑的。

标签: c# .net-3.5 implicit-conversion implicit


【解决方案1】:

您不能在参数的类或运算符的返回类型之外添加运算符。
换句话说:您不能添加一个运算符来在您都无法控制的两种类型之间进行转换。

你得到的编译器错误非常明确:

用户定义的转换必须与封闭类型相互转换

因此,您在这里尝试实现的目标根本不可能。
您最好的选择可能是int 上的扩展方法,它执行转换并返回string

【讨论】:

  • 我明白这一点。有没有办法解决这个问题以获得相同的效果?
  • @Kamil:你不能。但是,请参阅我更新的答案中的最后一句话以了解另一种方法。
  • 我已经做到了。我试图最小化我的代码并避免到处写.MyExtension()。也许我会编写自己的类并将该整数放入其中。谢谢。
【解决方案2】:

您可能需要考虑另一种方法。

您可以像这样在Control 上编写扩展方法:

public static class ControlExt
{
    public static void SetText(this Control self, object obj)
    {
        self.Text = obj.ToString();
    }
}

那么你的代码会变成:

int x = 50;
textbox1.SetText(x);

它当然适用于 any 类型,而不仅仅是 ints:

textbox1.SetText(DateTime.Now);

【讨论】:

    【解决方案3】:

    您需要添加隐式运算符作为类的成员。由于您无法控制int 类;无法将隐式运算符添加到 int 类。

    您可以为int 编写一个包装器,或者创建一个新的扩展方法来直接将int 转换为字符串(已经定义为ToString())。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-24
      • 1970-01-01
      • 1970-01-01
      • 2015-07-02
      • 2021-11-14
      • 2014-03-18
      相关资源
      最近更新 更多