.net 4.0 c++/cli自定义异常-标准构造函数

.net 4.0 c++/cli自定义异常-标准构造函数,.net-4.0,c++-cli,.net 4.0,C++ Cli,试图从C++/CLI库中避免FxCop警告“不要引发保留异常”,因此我决定分解并编写自己的异常类型 [Serializable] public ref class CaptureException : public Exception { public: CaptureException() : Exception() {} CaptureException(String^ message) : Exception(message) {} CaptureException

试图从C++/CLI库中避免FxCop警告“不要引发保留异常”,因此我决定分解并编写自己的异常类型

[Serializable]
public ref class CaptureException : public Exception
{
public:
    CaptureException() : Exception() {}
    CaptureException(String^ message) : Exception(message) {}
    CaptureException(String^ message, Exception^ inner) : Exception(message, inner) {}
protected:
    CaptureException(System::Runtime::Serialization::SerializationInfo^ info, System::Runtime::Serialization::StreamingContext^ context) : Exception(info, context) {}
};
这不符合我的要求

error C2664: 'System::Exception::Exception(System::String ^,System::Exception ^)' : cannot convert parameter 1 from 'System::Runtime::Serialization::SerializationInfo ^' to 'System::String ^'
我不知道为什么会出现这个错误。C++/CLI是否没有完整的异常类?我只是尝试为我的异常实现标准构造函数,在C#中,它看起来是这样的,并且编译得很好

[Serializable]
public class CaptureException : Exception
{
    public DatabaseConnectionException() { }
    public CaptureException (string message) : base(message) { }
    public CaptureException (string message, Exception inner) : base(message, inner) { }
    protected CaptureException (
      System.Runtime.Serialization.SerializationInfo info,
      System.Runtime.Serialization.StreamingContext context)
        : base(info, context) { }
}

StreamingContext是一种值类型(即结构),因此您需要删除hat^:

    CaptureException(System::Runtime::Serialization::SerializationInfo^ info, System::Runtime::Serialization::StreamingContext context) : Exception(info, context) 
{} 

比我快一分钟,因为我正在温习我的C++/CLI,只是为了回答这个问题。:)@阿达玛拉斯,哈——这一直发生在我身上。终于成为赢家真是太好了。我希望在我开始之前能有一种方法来看看有多少人正在研究一个答案。这是你应得的。我必须弄清楚是否需要在CLI值类型上添加任何修饰符(例如,对于托管句柄,%对于跟踪引用,等等),但当我弄清楚没有修饰符时,我看到了您的答案。非常感谢您的帮助。为什么编译器不会因为错误地将值类型标记为ref类型而发出警告?这似乎是一个相当常见的错误。@NTSCCOBOT:因为这并不违法;将
^
添加到值类型会导致隐式装箱,这是该语言的一个特性。