2013-07-22 68 views
2

我学会了为我的类使用隐式运算符。int的隐式运算符?

现在我想要做这样的事情:

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 
+0

为什么这是错的?在我看来,这是完全正确的! –

+0

@RomanoZumbé我更新了我的问题。当我尝试这样做时,编译器会说“用户定义的转换必须转换为包围类型或从包含类型转换” – Kamil

+0

您无法解决此问题,因为您必须*在转换的类中实现隐式运算符作为静态方法 - 当然,你不能改变System.Int32的实现。 –

回答

6

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

你的编译器错误是对此非常明确:

用户定义的转换必须转换或从封闭类型

所以,你正试图在这里实现的是简单不可能。
您的最佳选择可能是执行转换并返回stringint上的扩展方法。

+0

我明白。有没有办法解决这个问题,以获得相同的效果? – Kamil

+0

@Kamil:你不能。但是,请参阅我的更新答案中的最后一句,以获取其他方法。 –

+0

我已经做了。我试图尽量减少我的代码,避免在任何地方编写'.MyExtension()'。也许我会写自己的类,并把这个整数内。谢谢。 – Kamil

1

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

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

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

我喜欢它。你向我展示了我的想法是多么的落后:) – Kamil