在C#类中重载vb.net的&运算符

5
我在这里遇到了一个非常独特的问题。我们的业务应用程序是使用c#和vb.net构建的。我们一直在尝试采用标准方法来修剪一些已经复制的核心对象。我们已经接近成功,但当我们试图将一个重复的对象合并到c#中时,我们的vb.net代码现在开始抛出错误:“运算符“&”未定义为类型“CSType”和“String”,当我尝试使用&符号进行vb.net字符串连接时。有趣的是,如果我在c#中使用&CSType(在正确重载之后),我会得到我期望的字符串连接。
下面是CSType的基本重载:
public static string operator &(CSType c1, string s2)
{
    return c1.ToString() + s2;
}
public static string operator &(string s1, CSType c2) 
{
    return s1 + c2.ToString();
}

当我在c#中使用CSType和字符串运行“&”运算符时,我得到了预期的结果。当我尝试在vb.net中执行该操作时,代码将无法编译,并显示以下错误信息:“类型'CSType'和'String'之间未定义运算符'&'”。
CSType还可以隐式地转换为大多数数据类型,因此我认为可能有一些问题与“&”假定它是位运算符有关,但我猜这会导致执行出错而不是编译错误。
无论如何,我有点想把这个类放在c++中,在那里我知道我可以得到所需的东西,但是两种语言不是已经足够了吗?

8
在C#中,“&”重载了按位与运算符。 - SLaks
1
(我认为这里的含义是您需要为字符串提供一个强制转换运算符重载,并在VB.NET中使用CType。) - Markus
不要在商业应用程序中使用运算符重载。 :) - Victor Zakharov
1个回答

5
在C#中,& 运算符是位与运算符。因此,当您像这样重载它时:
public static string operator &(CSType c1, string s2)
{
    return c1.ToString() + s2;
}
public static string operator &(string s1, CSType c2) 
{
    return s1 + c2.ToString();
}

您可以在VB.Net中使用And运算符:

Dim a = New CSType("Foo")
Dim b = "Bar"
Dim c = a And b

然而,在VB.Net之外(例如C#)重载VB.Net的&运算符,您需要创建一个名为op_Concatenate的方法,并使用SpecialName属性:

[SpecialName]
public static string op_Concatenate(CSType c1, string s2)
{
    return c1.ToString() + s2;
}

[SpecialName]
public static string op_Concatenate(string s1, CSType c2)
{
    return s1 + c2.ToString();
}

接下来的代码将可行:
Dim a = New CSType("Foo")
Dim b = "Bar"
Dim c = a & b

谢谢,这真的非常有帮助! - zeedub

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