присваивать переменной структуры через свойство - PullRequest
3 голосов
/ 01 июня 2011

У меня есть следующее

Public Structure Foo
   dim i as integer
End Structure

Public Class Bar

Public Property MyFoo as Foo
Get
   return Foo
End Get
Set(ByVal value as Foo)
   foo  = value
End Set

dim foo as Foo    
End Class

Public Class Other

   Public Sub SomeFunc()    
     dim B as New Bar()    
     B.MyFoo = new Foo()    
     B.MyFoo.i = 14 'Expression is a value and therefore cannot be the target of an assignment ???    
   End Sub
End Class

У меня вопрос: почему я не могу назначить меня через свою собственность в классе Bar? Что я сделал не так?

Ответы [ 2 ]

3 голосов
/ 01 июня 2011

Ответ найден здесь , он говорит следующее:

' Assume this code runs inside Form1.
Dim exitButton As New System.Windows.Forms.Button()
exitButton.Text = "Exit this form"
exitButton.Location.X = 140
' The preceding line is an ERROR because of no storage for Location.

Последнее утверждение предыдущего пример терпит неудачу, потому что он создает только временное выделение для Точки структура, возвращаемая Location имущество. Структура является типом значения, и временная структура не сохраняется после выполнения оператора проблема решается путем объявления и используя переменную для Location, которая создает более постоянное распределение для структуры Point. Следующие пример показывает код, который может заменить последнее утверждение предыдущего Пример.

Это потому, что структура является только временной переменной. Поэтому решение состоит в том, чтобы создать новую структуру нужного вам типа, присвоить ей все ее внутренние переменные, а затем присвоить эту структуру свойству struct класса.

1 голос
/ 01 июня 2011

Вы могли бы сделать

Dim b as New Bar()
Dim newFoo As New Foo()
newFoo.i = 14
b.MyFoo = newFoo

Чтобы обойти проблему.

То же самое в C # с кодом

class Program
{
    public void Main()
    {
        Bar bar = new Bar();
        bar.foo = new Foo();
        bar.foo.i = 14;
        //You get, Cannot modify the return value of ...bar.foo
        //    because it is not a variable
    }
}
struct Foo
{
    public int i { get; set; }
}

class Bar
{
    public Foo foo { get; set; }
}

Как мне кажется, это более прямой способ сказать то же самое, что и

Expression is a value and therefore cannot be the target of an assignment
...