Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++/CLI:实现一个抽象C#类,该类在C+中实现INotifyPropertyChanged结果+;编译器错误C3766_C#_C++_.net_C++ Cli_Mixed Mode - Fatal编程技术网

C++/CLI:实现一个抽象C#类,该类在C+中实现INotifyPropertyChanged结果+;编译器错误C3766

C++/CLI:实现一个抽象C#类,该类在C+中实现INotifyPropertyChanged结果+;编译器错误C3766,c#,c++,.net,c++-cli,mixed-mode,C#,C++,.net,C++ Cli,Mixed Mode,我试图在C++/CLI中实现一个抽象C#类。这个抽象基类已经实现了INotifyPropertyChanged,正如在C#中所提到的: 在C++/CLI程序集中,我有另一个实现INotifyPropertyChanged的接口: public interface class IAnotherNotifyPropertyChangedClass : public INotifyPropertyChanged 现在,当从抽象C#类基类继承并在C++/CLI中实现IAnotherNotifyProp

我试图在C++/CLI中实现一个抽象C#类。这个抽象基类已经实现了INotifyPropertyChanged,正如在C#中所提到的:

在C++/CLI程序集中,我有另一个实现INotifyPropertyChanged的接口:

public interface class IAnotherNotifyPropertyChangedClass : public INotifyPropertyChanged
现在,当从抽象C#类基类继承并在C++/CLI中实现IAnotherNotifyPropertyChangedClass时,我得到以下信息:

public ref class AnotherNotifyPropertyChangedClass : public BaseClass, public IAnotherNotifyPropertyChangedClass
这将导致以下编译错误:

error C3766: 'AnotherNotifyPropertyChangedClass' must provide an implementation for the interface method 'void System::ComponentModel::INotifyPropertyChanged::PropertyChanged::add(System::ComponentModel::PropertyChangedEventHandler ^)'
只要我从iOnotherNotifyPropertyChangedClass接口声明中删除INotifyPropertyChanged,一切都会正常编译。为什么呢?当使用C#时,此声明可以很好地编译。我正在使用VS2012编译一个.NET3.5混合模式程序集

提前谢谢

干杯

编辑: 类似的问题(没有C#)如下:
那么,这是C++/CLI中的设计行为吗

这是因为interafce需要一个类似以下的实现:

#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
#endregion

因为C++类是抽象的,所以不必(必须)处理它,并且需要在C++类中实现它。这是第一个非抽象类。

这是因为interafce需要一个类似以下的实现:

#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
#endregion

因为C++类是抽象的,所以不必(必须)处理它,并且需要在C++类中实现它。这是第一个非抽象类。

您需要做的是在C++/CLI类中显式实现INotifyPropertyChanged。您可以让它调用已经实现的C#版本

我不能100%确定在您的场景中,您可能必须显式实现另一个NotifyPropertyChangedClass::PropertyChanged而不是
INotifyPropertyChanged::PropertyChanged

private:
    event PropertyChangedEventHandler^ DuplicatePropertyChanged
    {
        virtual void add (PropertyChangedEventHandler^ value) sealed = 
            INotifyPropertyChanged::PropertyChanged::add
        {
            // Add to the event defined in the C# class.
            this->PropertyChanged += value;
        }

        virtual void remove (PropertyChangedEventHandler^ value) sealed = 
            INotifyPropertyChanged::PropertyChanged::remove
        {
            // Remove from the event defined in the C# class.
            this->PropertyChanged -= value;
        }
    }

您需要做的是在C++/CLI类中显式实现INotifyPropertyChanged。您可以让它调用已经实现的C#版本

我不能100%确定在您的场景中,您可能必须显式实现另一个NotifyPropertyChangedClass::PropertyChanged而不是
INotifyPropertyChanged::PropertyChanged

private:
    event PropertyChangedEventHandler^ DuplicatePropertyChanged
    {
        virtual void add (PropertyChangedEventHandler^ value) sealed = 
            INotifyPropertyChanged::PropertyChanged::add
        {
            // Add to the event defined in the C# class.
            this->PropertyChanged += value;
        }

        virtual void remove (PropertyChangedEventHandler^ value) sealed = 
            INotifyPropertyChanged::PropertyChanged::remove
        {
            // Remove from the event defined in the C# class.
            this->PropertyChanged -= value;
        }
    }

这是不正常的,我也没有得到任何惩罚。问题没有显示实际代码,我将显示我的:

C#测试类:

using System.ComponentModel;

namespace ClassLibrary8 {
    public abstract class CFoo : INotifyPropertyChanged {
        public event PropertyChangedEventHandler PropertyChanged;
    }
}
在将引用添加到C#项目后,C++/CLI测试代码:


这是不正常的,我也没有得到任何惩罚。问题没有显示实际代码,我将显示我的:

C#测试类:

using System.ComponentModel;

namespace ClassLibrary8 {
    public abstract class CFoo : INotifyPropertyChanged {
        public event PropertyChangedEventHandler PropertyChanged;
    }
}
在将引用添加到C#项目后,C++/CLI测试代码:


用C#编写的抽象类正在实现接口。在纯C#中执行相同的场景(声明另一个接口继承INotifyPropertyChanged并在基类上实现它)非常有吸引力……如果有两个INotifyPropertyChanged实现,我想说的是。这与公共IEnumerator GetEnumerator()和IEnumerable.GetEnumerator()的情况类似,在这两种情况下,您需要两者都可用。用C#编写的抽象类正在实现接口。在纯C#中执行相同的场景(声明另一个接口继承INotifyPropertyChanged并在基类上实现它)非常有吸引力……如果有两个INotifyPropertyChanged实现,我想说的是。这与公共IEnumerator GetEnumerator()和IEnumerable.GetEnumerator()的情况类似,在这两种情况下,您需要两者都可用。这正是我实现这些类的方式。唯一的区别是CFoo接受一个类型参数并读取“CFoo”。在纯C语言中编写C++/CLI代码时,一切正常。你也在使用VS2012和3.5吗?我可以再次尝试重新编程。但如果你还没有提到另一个细节,那很可能又是在浪费我的时间。你必须发布一篇文章来说明问题,以获得帮助。这正是我实现这些类的方式。唯一的区别是CFoo接受一个类型参数并读取“CFoo”。在纯C语言中编写C++/CLI代码时,一切正常。你也在使用VS2012和3.5吗?我可以再次尝试重新编程。但如果你还没有提到另一个细节,那很可能又是在浪费我的时间。你必须发布一个说明问题的帖子才能得到帮助。我明白你的意思。这正是编译器希望我做的,但为什么在C#中实现C++/CLI类时不需要这样做呢?我明白你的意思。这正是编译器希望我做的,但为什么在C#中实现C++/CLI类时不需要这样做呢?