为什么在VB.NET中无法重载赋值运算符?

7

为什么在VB.NET中无法重载赋值运算符(+=,-=,*=,/=)?


(译者注:重载指的是自定义运算符行为。)

@Mr.Disappointment - 是的,我自己也发现了。你能指出那篇文章中为什么赋值运算符不能重载吗? - user1351569
@Mr.Disappointment - 我想也许你会读到我错过的内容。 - user1351569
添加了一些关于隐式/显式转换器的内容,可能有助于您正在尝试做的任何事情。 - Alain
1
@Oded 哈哈!虽然在这种情况下 VB 确实 和 C# 完全 一样,所以你的评论很好,但你把它放错了问题 :) - MarkJ
2
我非常欣慰地看到这个问题被关闭,因为它不具有建设性。在这个调查中,我几乎学到了一些东西,但是被管理团队指出了这种愚蠢的行为。如果这个问题没有被关闭,我担心会发生什么混乱。 - ironsam
1个回答

11

或许这里是他们的原因:

感谢您的建议!我们不允许您重载类型的赋值运算符,因为目前没有办法确保其他语言或.NET框架本身会遵守赋值运算符。唯一的选择是限制那些重载赋值运算符的类型能做什么,但我们认为这样做过于严格,不太实用。

谢谢!Paul Vick 技术负责人,VB

还有一种叫作“缩小”和“扩大”的方法,可以定义从一种类型到另一种类型的显式和隐式转换器,例如:

Dim y as MyClass1
Dim x as MyClass2 = y

但这并不允许更改分配操作符以分配同一类的实例,只能转换其他类。

请参见如何定义转换运算符

Class MyClass1
    Public Shared Widening Operator CType(ByVal p1 As MyClass1) As MyClass2

    End Operator
End Class

在C#中相同

+=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=

赋值运算符无法重载,但是例如 += 将使用可以被重载的 + 运算符进行计算。

=, ., ?:, ??, ->, =>, f(x), as, checked, unchecked, default, delegate, is, new, sizeof, typeof

这些运算符无法重载。

与相同的转换运算符

struct MyType1
{
    ...
    public static explicit operator MyType1(MyType2 src)  //explicit conversion operator
    {
        return new MyType1 { guts = src.guts };
    }
}

2004年以“不修复”为由关闭了该问题单 - rofl。希望他们已经重新审视了这个建议。 - Alain
它可以吗?https://dev59.com/0nVC5IYBdhLWcg3wcgqd - Alain
1
C# 不支持运算符重载:http://msdn.microsoft.com/en-us/library/8edha89s.aspx。一个近似的解决方法是重载运算符 +,因为 += 使用它,但你仍然不能重载 = - Alain

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