我正在尝试编写混合程序集,这是一个片段:
public ref class OpusStream
: public Stream
{
protected:
OpusStream(void);
public:
~OpusStream(void);
!OpusStream(void);
int TestEncode(void);
/* System::IO::Stream */
virtual property bool CanRead { bool get(void) override; }
virtual property bool CanSeek { bool get(void) override; }
virtual property bool CanWrite { bool get(void) override; }
virtual property __int64 Length { __int64 get(void) override; }
virtual property __int64 Position {
__int64 get(void) override;
void set(__int64) override;
}
virtual void Flush(void) override;
int Read(Byte[], int, int) override;
long Seek(long, System::IO::SeekOrigin) override;
void SetLength(long) override;
void Write(Byte[], int, int) override;
};
这是编译器错误:
错误11无法创建抽象类或接口'OpusNet.OpusStream'的实例C:\ Users \ benc \ Documents \ opus-1.1-alpha \ OpusTests \ MainWindow.xaml.cs 30 21 OpusTests
自从我完成C ++ / CLI以来已经有一段时间了,我真的不确定我在这里错过了什么。
答案 0 :(得分:1)
Read
和Write
覆盖使用了错误的类型(根据C#)byte[]
。
对于实际覆盖流上方法的覆盖,你需要使用正确的类型,这是通过修改override
省略的迂回方式,直到编译器告诉我我在系统上隐藏了一个方法.IO.Stream:
因此;
typedef array<Byte>^ ByteArray;
然后;
virtual __int32 Read(ByteArray, __int32, __int32) override;
答案 1 :(得分:0)
问题在于这些属性定义:
virtual property bool CanRead { bool get(void) sealed new; }
virtual property bool CanSeek { bool get(void) sealed new; }
通过将其声明为new
,您不会覆盖基类上的抽象成员!相反,您在类中声明了一个新成员,其名称与基类的抽象成员相同,但不会覆盖抽象成员。
将其切换为实际覆盖该成员,你会没事的。
virtual property bool CanRead { bool get(void) sealed override; }
virtual property bool CanSeek { bool get(void) sealed override; }
^^^^^^^^