我尝试使用C#编写的第三方软件的试用版.当我尝试使用它的API时,我遇到了一个奇怪的问题.
我正在使用visual studio 2015,我在他们的API-SDK中发现了一个有趣的扩展方法签名
public static class CallExtendedInfoEx
{
public static void AddToSIPMessage(this CallExtendedInfo info, msg);
}
Run Code Online (Sandbox Code Playgroud)
第二个参数类型不存在.以前在C#中没见过.我尝试将通用的Object参数作为第二个参数,并且C#Compiler给出了一个奇怪的错误
严重性代码描述项目文件行
错误CS1503参数2:无法从'object'转换为'.'
它使用"null"...没有编译器错误或运行时错误[忽略我认为]
那些人怎么能用C#编写这样的代码?它可以吗?任何的想法?
注意:我怀疑代码存在问题...但我仍然不明白这里发生了什么
IL_0073: call void [CallExtendedInfoEx::AddToSIPMessage(class [VoIP.CallExtendedInfo,
class [VoIPSDK]''.'')
Run Code Online (Sandbox Code Playgroud)
好吧,看一下ILDASM输出,很明显该参数具有完全有效的类型.当然,它是一种你无法在C#中实际命名的类型,但它在CLR中完全有效.
您可以传递的事实null不应该令人惊讶 - 参数是引用类型(或可转换null),因此null是一个完全有效的值.另一方面,期望传递一个object实例是完全错误的 - 你只能传递更多派生类型作为参数,而不是更少.传递string(更具体)而不是object(不太具体)是好的,但不是相反.
最有可能的是,这是一个你不应该触摸的方法(即不是API/SDK的公共合同的一部分),或者你应该从其他方法获取参数的实例 - 从不在任何地方使用显式类型.