简体   繁体   中英

Can't port C# code to managed C++ implementing IDataErrorInfo

This part. Commented code is cs. On compile catch an error:

Error   78
error C3766: 'Sample::NoteInfo' must provide an implementation for the interface method 'System::String ^System::ComponentModel::IDataErrorInfo::default::get(System::String ^)'
d:\dev\docstreet\sample\pointInfoStoreClass.h   100

What's incorrect? Why VS compiler consider this not implemented?

//Returns an error description set for the item's property
//String^ IDataErrorInfo.this[String^ columnName] {
//  get {
//      return GetColumnError(columnName);
//  }
//}

public: property String^ IDataErrorInfo[String^] {
    virtual String^ get(String^ index) override {
        return GetColumnError(index);
    }
}

Full code:

public ref class NoteInfo : IDataErrorInfo {
        int fDay;
        int fMonth;
        int fYear;
        int fNoteID;
        //References the item's owner
        ProjectNotes^ owner;
        //Stores error descriptions for the Day, Month, Year and NoteID properties
        Hashtable^ propertyErrors;
        //Stores an error description for the item
        String^ fNoteError;


    public: NoteInfo(int noteID, int day, int month, int year) {
            fNoteID = noteID;
            fDay = day;
            fMonth = month;
            fYear = year;
            //Set errors to empty strings
            propertyErrors = gcnew Hashtable();
            propertyErrors->Add('Day', '');
            propertyErrors->Add('Month', '');
            propertyErrors->Add('Year', '');
            propertyErrors->Add('NoteID', '');
            fNoteError = '';
            Owner = nullptr;
        }

    public: property int NoteID {
            int get() { return fNoteID; }
            void set(int value) {
                if(fNoteID == value) return;
                fNoteID = value;
            }
        }

    public: void ClearErrors() {
            SetColumnError('Day', '');
            SetColumnError('Month', '');
            SetColumnError('Year', '');
            fNoteError = '';
        }

        //Sets an error for an item's property
    public: void SetColumnError(String^ elem, String^ error) {
            if(propertyErrors->ContainsKey(elem)) {
                if((String^)propertyErrors[elem] == error) return;
                propertyErrors[elem] = error;
            }
        }

        //Gets an error for an item's property
    public: String^ GetColumnError(String^ elem) {
            if(propertyErrors->ContainsKey(elem))
                return (String^)propertyErrors[elem];
            else
                return '';
        }

        //The owner collection
    internal: property ProjectNotes^ Owner {
            ProjectNotes^ get() { return owner; }
            void set(ProjectNotes^ value) { owner = value; }
        }


#pragma region IDataErrorInfo Members

        //Returns an error description set for the item's property
        //String^ IDataErrorInfo.this[String^ columnName] {
        //  get {
        //      return GetColumnError(columnName);
        //  }
        //}

        public: property String^ IDataErrorInfo[String^] {
            virtual String^ get(String^ index) override {
                return GetColumnError(index);
            }
        }

        //Returns an error description set for the current item
    public: property String^ Error {
            virtual String^ get() { return fNoteError; }

        }
#pragma endregion
    };

Both the C# and the C++/CLI languages require a special name for the indexer of a class to allow the compiler to recognize it as the indexer. C# uses this , C++/CLI uses the default keyword. The MSDN Library calls it "Item" to add to the confusion, somewhat inevitably since the name depends on the language. So it must look like this:

public: property String^ default[String^] {
            virtual String^ get(String^ index) {
                // etc...
            }
        }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM