C# IDL中的返回值

C# IDL中的返回值,c#,com,interop,return-type,idl,C#,Com,Interop,Return Type,Idl,我不明白为什么返回值在参数列表中定义为[out,retval]。常识告诉我,HRESULT应该是返回类型,但它似乎对C#中的代码没有任何影响。COM不支持异常。它们是一个非常强大的语言运行时实现细节,C异常不是任何一个C++异常。这使得HRESULT非常重要,它是替代品。每个COM方法都应该返回一个错误代码,负值表示失败 但许多语言确实支持例外。允许语言运行库将失败的HRESULT转换为异常。因此,不再需要返回值 它允许类型库导入器和CLR重写方法签名。使它看起来像一个“普通”函数,一个具有有用

我不明白为什么返回值在参数列表中定义为[out,retval]。常识告诉我,HRESULT应该是返回类型,但它似乎对C#中的代码没有任何影响。

COM不支持异常。它们是一个非常强大的语言运行时实现细节,C异常不是任何一个C++异常。这使得HRESULT非常重要,它是替代品。每个COM方法都应该返回一个错误代码,负值表示失败

但许多语言确实支持例外。允许语言运行库将失败的HRESULT转换为异常。因此,不再需要返回值

它允许类型库导入器和CLR重写方法签名。使它看起来像一个“普通”函数,一个具有有用返回值的函数。[retval]属性表明了这一点。如果没有,它将成为返回void的正常方法

还解释了[PreserveSig]属性的相关性,它抑制了这种重写。当HRESULT返回的值超过0表示成功时,有时是必要的。例如,COM迭代器需要它