2024-10-01 09:42:09 发布
网友
是的,我知道,这个问题似乎和以前问过几千次的问题是一样的。 但不,这不是真的-至少我认为是这样。在
我使用IronPython并希望调用C方法:
bool GetClassInstance<T>(out T myClassInstance)
通过python调用此函数如下所示:
问题是以下错误消息:
expected StrongBox[ClassType], got NoneType (ArgumentTypeException)
现在我有两个问题:
非常感谢!!在
Jeff的回答很好-但是如果您真的想要ref/out语义,答案是在异常中,您可以使用StrongBox类型(通过clr.STRONG框,但这是LINQ使用的同一个强框):
import clr myClassInstance = clr.StrongBox[ClassType]() myInstance.GetClassInstance[ClassType](myClassInstance) print myClassInstance.Value # value is now updated
这将启用一些奇怪的情况,例如当函数重载并且只在ref/out参数上不同时,或者当您希望在另一个线程上查看在GetClassInstance返回之前更新的值时。在
要调用具有out参数的方法,只需省略参数(因为您并没有真正传递一个值),它的返回值将是一个元组,其中包含函数的结果(如果它不是void)和{}值的定义顺序。在
out
void
在ref参数的情况下,传入参数,它仍将返回到元组中。对象上的任何突变都将按预期工作。在
ref
例如
>>> from System import Int32 >>> Int32.TryParse('12345') (True, 12345) >>> Int32.TryParse('12345x') (False, 0)
我做了一个测试,这样你就可以知道如何称呼不同的变体。在
>>> from TestLibrary import Test >>> Test.Test1() 1 >>> Test.Test2() (True, 2) >>> Test.Test3(1, 3) 4 >>> Test.Test4(1, 3) (True, 4) >>> Test.Test5(1, 3) (4, 3) >>> Test.Test6(1, 3) (False, 4, 3) >>> Test.Test7(1, 3, 5) "5" -> "6" (4, 3, 6) >>> Test.Test8(1, 3, 5) "5" -> "6" (False, 4, 3, 6) >>> from System import Array >>> array = Array.CreateInstance(int, 10) >>> array Array[int]((0, 0, 0, 0, 0, 0, 0, 0, 0, 0)) >>> Test.Test9(1, 3, 5, array) "5" -> "6" (False, 4, 3, 6, Array[int]((0, 1, 2, 3, 4, 5, 6, 7, 8, 9))) >>> array Array[int]((0, 1, 2, 3, 4, 5, 6, 7, 8, 9))
或者,如果希望使用C样式调用,则需要传入一个clr.Reference[T]对象来代替out/ref参数来保存该值。您可以通过Value属性访问该值。在
clr.Reference[T]
Value
>>> outval = clr.Reference[int]() >>> Test.Test1(outval) >>> outval <System.Int32 object at 0x000000000000002B [1]> >>> outval.Value 1
Jeff的回答很好-但是如果您真的想要ref/out语义,答案是在异常中,您可以使用StrongBox类型(通过clr.STRONG框,但这是LINQ使用的同一个强框):
这将启用一些奇怪的情况,例如当函数重载并且只在ref/out参数上不同时,或者当您希望在另一个线程上查看在GetClassInstance返回之前更新的值时。在
要调用具有}值的定义顺序。在
out
参数的方法,只需省略参数(因为您并没有真正传递一个值),它的返回值将是一个元组,其中包含函数的结果(如果它不是void
)和{在
ref
参数的情况下,传入参数,它仍将返回到元组中。对象上的任何突变都将按预期工作。在例如
我做了一个测试,这样你就可以知道如何称呼不同的变体。在
^{pr2}$或者,如果希望使用C样式调用,则需要传入一个
clr.Reference[T]
对象来代替out
/ref
参数来保存该值。您可以通过Value
属性访问该值。在相关问题 更多 >
编程相关推荐