7

为什么赋值运算符(+=、-=、*=、/=)在 VB.NET 中不能重载?

4

1 回答 1

11

也许是他们的推理:

感谢您的建议!我们不允许您为某个类型重载赋值运算符,因为目前无法确保其他语言或 .NET Framework 本身将遵守赋值运算符。唯一的替代方法是限制重载赋值运算符可以执行的类型,但我们认为这太严格而无法普遍使用。

谢谢!Paul Vick 技术主管,VB

有一种叫做“Narrowing”和“Widening”的东西,它允许你定义从一种类型到另一种类型的显式和隐式转换器,即

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 };
    }
}
于 2012-04-23T14:39:19.770 回答