Страница: 1 |
Страница: 1 |
Вопрос: работа со структурами
Добавлено: 08.08.10 16:47
Автор вопроса: Ant
почему вылетает ошибка "Access of shared member through an instance; qualifying expression will not be evaluated"?
код такой
public structure myStruct
a1
a2
end structure
public class myClass
public function myFunction as myStruct 'вот так можно вообще?
dim retval as new myStruct
retval.a1=1 'вот это не прокатывает, почему?
return retval
end function
end class
Ответы
Всего ответов: 10
Номер ответа: 1
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #1
Добавлено: 08.08.10 17:57
1. У полей нужно указывать модификатор доступа (public/private/...), а можно даже и тип (Integer, String и т.п.)
2. MyClass - это зарезервированое ключевое слово в языке VB .NET (используется для доступа к текущему экземпляру класса, наряду с Me и MyBase). Если нужно создать тип с именем MyClass, то нужно писать [MyClass]
3. .....
4. PROFIT!!!
В таком виде код компилируется без ошибок. Я не говорю про ужасную нотацию, отсутствие указания типов и про то что в 99% случаев в такой ситуации нужно использовать не структурный тип (Structure), а ссылочный (Class).
Номер ответа: 2
Автор ответа:
Ant
Вопросов: 1
Ответов: 7
Профиль | | #2
Добавлено: 08.08.10 19:17
Странно, а у меня 2010 студия кидает эксепшн на строке retval.a1 = 1 , то есть на прямом присвоении значения члену структуры.
Обошелся таким методом:
...и вот так - retval.SetValues(100,200) - присвоение работает без ошибок. чтение же значений retval.a1 проходит нормально.
может быть, играет роль объявление членов структуры как Public Shared? сейчас делаю всё тупо "по книжке", где я неправ в мелочах - разбираться буду потом))
P.S. типы в примере не указывал, можно сказать, специально - дело не в них, писал этот код вручную потому что.
P.P.S. не мог бы ты набросать пример использования ссылочного типа в моей ситуации? как это пишется всё синтаксически, если использовать структуру я хочу в модуле формы? где объявлять класс - над классом формы или внутри его, и т.п.? ну не въезжаю я ещё во все эти классы после VB6
Номер ответа: 3
Автор ответа:
Ant
Вопросов: 1
Ответов: 7
Профиль | | #3
Добавлено: 08.08.10 19:25
ёпрст! Public Shared!!!
Номер ответа: 4
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #4
Добавлено: 08.08.10 20:09
Исключения не может быть, если у тебя исклюение, значит ты что-то менял в коде.
Shared - это общий член типа, и он в данном случае не нужен. Shared не указывается.
Чтоб ссылочный тип сделать, все так же, но вместо Structure пишешь Class
Номер ответа: 5
Автор ответа:
Ant
Вопросов: 1
Ответов: 7
Профиль | | #5
Добавлено: 08.08.10 20:14
исключение вылетало на присвоении значения retval.a1 тогда, когда в структуре a1 объявлялся как Public Shared a1
Номер ответа: 6
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #6
Добавлено: 08.08.10 20:21
код в студию
Номер ответа: 7
Автор ответа:
Ant
Вопросов: 1
Ответов: 7
Профиль | | #7
Добавлено: 08.08.10 20:22
Номер ответа: 8
Автор ответа:
Ant
Вопросов: 1
Ответов: 7
Профиль | | #8
Добавлено: 08.08.10 20:28
запутался уже в примерах и реальном коде))
Номер ответа: 9
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #9
Добавлено: 08.08.10 20:30
Исключения нет, только warning (обращение к общему члену типа через экземпляр типа). Shared нужно везде убрать.
Номер ответа: 10
Автор ответа:
Ant
Вопросов: 1
Ответов: 7
Профиль | | #10
Добавлено: 08.08.10 20:35
я уж понял. потихоньку въезжаю в концепцию ( http://msdn.microsoft.com/ru-ru/library/4hbsxy95%28VS.90%29.aspx )