2012-11-29 128 views
1

此部分。評論代碼是cs。 在編譯捕獲錯誤:無法將C#代碼移植到託管C++實施IDataErrorInfo

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 

什麼是不正確的?爲什麼VS編譯器考慮這個沒有實現?

//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); 
    } 
} 

全碼:

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 
    }; 

回答

2

無論是C#和C++/CLI語言需要一類的索引一個特別的名字,讓編譯器將其識別爲索引。 C#使用這個,C++/CLI使用默認關鍵字。 MSDN Library稱它爲「Item」以增加混淆,因爲名稱取決於語言,所以有些不可避免。因此,它必須如下所示:

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

對於級別索引器,對屬性級索引器使用'default'使用該屬性的名稱。 – plinth

+0

謝謝!它有助於! –