2015-04-29 1 views
-2

Я использую структуру, показанную нижене удается получить доступ к Объявлены структурам с объектом

public struct TPCANMsg 
{ 
    /// <summary> 
    /// 11/29-bit message identifier 
    /// </summary> 
    public uint ID; 
    /// <summary> 
    /// Type of the message 
    /// </summary> 
    [MarshalAs(UnmanagedType.U1)] 
    public TPCANMessageType MSGTYPE; 
    /// <summary> 
    /// Data Length Code of the message (0..8) 
    /// </summary> 
    public byte LEN;  
    /// <summary> 
    /// Data of the message (DATA[0]..DATA[7]) 
    /// </summary> 
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] 
    public byte[] DATA; 
} 

Затем объявляется объект для структуры в поле ниже

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using Peak.Can.Basic; 

namespace rcToOnBoardPC 
{ 
    class Communication 
    { 
     // CAN Status Decalaration 
     TPCANStatus gStatus; 
     // List of CAN Messages 
     TPCANMsg msg1 = new TPCANMsg();  
     msg1.ID = 0x100; 

    } 
} 

Я получаю следующее сообщение об ошибке "Ошибка 1 Недопустимого маркера '=' в объявлении члена класса, структуры или интерфейса. " Не могу понять, почему я не могу получить доступ к структуре с соответствующим объектом. Пожалуйста, направляйте.

+3

'msg1.ID = 0x100;' плавает вне метода, помещает его в ctor? –

+0

Или просто 'TPCANMsg msg1 = новый TPCANMsg {ID = 0x100};' –

+0

@AlexK. Пожалуйста, уточните «ctor». Пожалуйста, постарайтесь выразить это проще. Я не так хорошо экипирован, как вы, когда речь идет о программировании. Предпочтительным является пример. Поскольку, задавая вопросы, нужно быть ясным, я бы ожидал, что эксперты, давая ответ, более ясны. –

ответ

0

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

В то же время, вот что комментаторы пытаются сказать вам и hellip;

Основная проблема заключается в том, что вы написали заявление программы вне метода. В C# (и, действительно, любой подобный язык) это недопустимо. Программные заявления должны содержаться в методе (он же «функция»).

Вы можете решить эту проблему одним из двух способов. Проще всего понять это поместить в метод (т.е. выполнять непосредственно с правилом языка, вы работаете против):

class Communication 
{ 
    // CAN Status Decalaration 
    TPCANStatus gStatus; 
    // List of CAN Messages 
    TPCANMsg msg1 = new TPCANMsg(); 

    public Communication() 
    { 
     msg1.ID = 0x100; 
    } 
} 

второй путь для решения этой проблемы опирается на тот факт, что в то время как программа операторы не могут существовать вне метода, вы можете использовать выражения в различных контекстах, включая инициализаторы. И C# имеет синтаксис инициализатора, который позволяет включать утверждения присваивания как часть инициализации. То есть технически вы просто пишете выражение инициализации, но в этом контексте вам разрешено писать небольшой блок кода, который до тех пор, пока единственным типом программного оператора, который он включает, является присвоение, является законным, даже если он находится вне метода

Такой подход будет выглядеть следующим образом:

class Communication 
{ 
    // CAN Status Decalaration 
    TPCANStatus gStatus; 
    // List of CAN Messages 
    TPCANMsg msg1 = new TPCANMsg { ID = 0x100 }; 
} 

Обратите внимание, что при использовании этого синтаксиса, вы также разрешается опускать Паренс () от вызова конструктора без параметров. Это не требуется; если вы предпочитаете писать new TPCANMsg() { ID = 0x100 }, это тоже допускается.

+0

Thanx много, я понял это, но все же его очень хороший ответ и оценил за то, что уделил мне время, чтобы помочь таким людям, как мы. Я надеюсь, что у большего количества людей будет терпение, которое вы проявите. Не могу поблагодарить вас ... –

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