2012-04-23 3 views
6

Почему операторы присваивания (+ =, - =, * =,/=) не перегружаются в VB.NET?Почему операторы присваивания не перегружаются в VB.NET?

+0

@ Mr.Disappointment - Да, нашел, что я. Не могли бы вы указать, где в этой статье говорится, почему операторы присваивания не являются перегружаемыми? – user1351569

+0

@ Mr.Disappointment - Думал, возможно, вы прочитали что-то, что я пропустил. – user1351569

+0

Добавил некоторые вещи о неявных/явных конвертерах, которые могли бы помочь с тем, что вы, возможно, пытаетесь сделать. – Alain

ответ

10

Возможно this их рассуждения:

Спасибо за предложение! Мы не разрешаем вам перегружать оператор присваивания для типа, потому что в настоящее время нет способа гарантировать, что другие языки или сама .NET Framework будут выполнять оператор присваивания. Единственная альтернатива заключается в том, чтобы ограничить типы , которые могут перегрузить оператор присваивания, но мы чувствовали, что это было бы слишком ограничительным, чтобы быть в целом полезным.

Спасибо! Paul Vick технический руководитель, В. Б.

Там что-то называется «Сужение» и «Расширяя», который позволяет определить явные и неявные конвертеров от одного типа к другому, т.е.

Dim y as MyClass1 
Dim x as MyClass2 = y 

Но это не пусть изменить оператор присваивания для назначения экземпляра того же класса, только преобразование других классов.

См How to: Define a Conversion Operator

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

    End Operator 
End Class 

Same in C#

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

Операторы присваивания не могут быть перегружены, но + =, например, вычисляется с помощью +, которые могут быть перегружены ,

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

Эти операторы не могут быть перегружены.

С той же conversion operators:

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

Билет закрыт как «Не исправит» в 2004 году - rofl. Здесь мы надеемся, что они с тех пор пересмотрели предложение. – Alain

+0

Не так ли? http://stackoverflow.com/questions/292676/is-there-a-workaround-for-overloading-the-assignment-operator-in-c – Alain

+1

C# не поддерживает перегрузки операторов: http://msdn.microsoft. ком/EN-US/библиотека/8edha89s.aspx.Обходной способ ish - перегрузить оператор '+', поскольку + = использует его, но вы все равно не можете перегружать '='. – Alain

Смежные вопросы