在C#中,没有参数类型的方法参数

7

我尝试使用基于C#编写的第三方软件的试用版。当我尝试使用其API时,遇到了一个奇怪的问题。

我正在使用Visual Studio 2015,发现他们API-SDK中有一个有趣的扩展方法签名。

  public static class CallExtendedInfoEx
  {
        public static void AddToSIPMessage(this CallExtendedInfo info,  msg);
  }

第二个参数类型不存在。在C#中从未见过。我尝试将一个通用的Object参数作为第二个参数,但是C#编译器会给出一个奇怪的错误。
严重性代码说明项目文件行
错误CS1503:参数2:无法从“object”转换为“。”。
它可以与“null”一起使用……没有编译器错误或运行时错误[我认为被忽略了]。
这些人如何能在C#中编写这样的代码?可能吗?有什么想法吗?
注意:我怀疑这是一个代码模糊问题……但是我仍然不明白这里发生了什么。
  IL_0073:  call       void [CallExtendedInfoEx::AddToSIPMessage(class [VoIP.CallExtendedInfo,
                                                                                  class [VoIPSDK]''.'')

msg的类型是什么? - Amit Kumar Ghosh
它没有说明,这就是问题所在。我无法弄清楚它。它在方法签名中不存在。 - Hippias Minor
2
你在哪里看到的?在反编译源代码中吗?在文档中吗?参数“必须”具有类型,因此它不是有效的C#。 - D Stanley
1
编译后的代码必须有效。我猜测反编译器中可能存在一些错误,或者他们已经找到了一个巧妙的混淆技巧。 - D Stanley
4
当你使用ILDASM反编译库时,该方法的签名是什么? - Eric Lippert
显示剩余6条评论
2个回答

5
看一下 ILDASM 的输出,很明显参数具有完全有效的类型。当然,这是一种在 C# 中不能命名的类型,但在 CLR 中是完全有效的。 可以传递 null 并不奇怪,因为参数是引用类型(或可从 null 转换),所以 null 是一个完全有效的值。另一方面,期望传递一个 object 实例完全是错误的——只能传递更派生的类型作为参数,而不是不派生的类型。将 string(更具体)而不是 object(不太具体)传递是可以的,但反过来就不行。 最可能的情况是,这是一个你不应该触碰的方法(即不属于 API/SDK 的公共合同部分),或者你应该从其他方法获取参数的实例——永远不要在任何地方使用显式的类型。

该方法位于公共部分。看起来参数类型是C#中实际上不存在的类型...也许是C++类型...但仍然很有趣...谢谢。 - Hippias Minor
@HippiasMinor 你可以使用它 - 只是你不能明确地命名它。这仍然允许你从另一个方法的返回值中传递它,或者使用 var 将其存储在本地变量中。你甚至可以将它作为 dynamic 存储在字段中,尽管这会破坏静态类型。文档对使用有何说明? - Luaan
什么都没有...文档很糟糕。 - Hippias Minor
我的真正兴趣不在于使用SDK...我只是想知道这是如何发生的...只是好奇...谢谢 - Hippias Minor
但是他们的消息操作API更糟糕:ISIPMessageManipulator...这也很危险。它允许您操纵所有消息,而不仅仅是您想要的。如果您有消耗时间的业务逻辑,则会阻止消息传递... - Hippias Minor
显示剩余4条评论

3

这不是有效的 C# 代码。可能是反编译器给出了这段代码,或者你复制的文档有误。


如果它不是有效的C#,那么我如何使用带有null的方法?编译器不会发出任何警告。 - Hippias Minor
我只是在玩方法。找不到真正的类型,所以我只是将null传递给方法。它可以编译通过。当然这没什么用,只是为了检查一下。 - Hippias Minor
1
你是在引用已编译的库(DLL)还是在编译他们的源代码?如果这个库已经被编译过了,你就不会从他们的代码中得到编译器错误。 - D Stanley
1
@HippiasMinor null不是object类型 - 它是一种推断类型,这里的.会给你带来麻烦。这个实验只告诉你参数是引用类型,或者可以从null转换过来。C#编译器对类型是有静态了解的。问题在于你的反编译器(或者更准确地说,你期望使用SDK的未记录部分)。如果你不理解这个,你需要学习一下参数类型的变异 - 把string作为 object传递是可以的,但反过来则不行。 - Luaan
编译器不知道类型…它说“.”…那么“.”在Luaan中是什么类型?在提供有关参数类型差异的建议之前,应阅读问题。 - Hippias Minor
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接