可空整数类型的隐式转换运算符

3

我已经学会如何为我的类使用隐式操作符。

现在我想做这样的事情:


```csharp MyClass myClass = "some value"; ```

如何实现这个功能?

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

为什么这是错的?在我看来,它完全正确! - Romano Zumbé
@RomanoZumbé,我更新了我的问题。当我尝试这样做时,编译器会显示“用户定义的转换必须转换为封闭类型或从封闭类型转换”。 - Kamil
你无法绕过这个问题,因为你必须在被转换的类中实现隐式操作符作为静态方法 - 当然,你不能改变System.Int32的实现。 - Matthew Watson
3
这是一个糟糕的目标。不要试图写出这样的代码。人们对于关闭option strict选项的VB.NET程序员提出质疑是有原因的。 - J...
@J...我会考虑的。 - Kamil
3个回答

6
您不能在参数或运算符返回类型的类之外添加运算符。换句话说:您不能添加在两个不受您控制的类型之间进行转换的运算符。
你得到的编译器错误非常明确:
“用户定义的转换必须转换为封闭类型或从封闭类型转换”
因此,您在此处尝试实现的内容是不可能的。
您最好的选择可能是对int进行扩展方法来执行转换并返回一个string

我理解。没有办法绕过这个问题来达到相同的效果吗? - Kamil
@Kamil:你不能这样做。不过,请看一下我更新的答案中的最后一句话,那里有一个替代方案。 - Daniel Hilgarth
我已经尝试过了。我试图将我的代码最小化,并避免在每个地方都写.MyExtension()。也许我会编写自己的类并将该整数放入其中。谢谢。 - Kamil

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);

当然,它适用于任何类型,而不仅仅是整数:

textbox1.SetText(DateTime.Now);

1
你需要将隐式操作符作为类的成员添加。由于你无法控制int类,因此无法向int类添加隐式操作符。
你可以编写一个int包装器,或者创建一个新的扩展方法来直接将int转换为字符串(已经定义为ToString())。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接