(铁)定义特定类型变量的Python

2024-10-01 09:42:09 发布

您现在位置:Python中文网/ 问答频道 /正文

是的,我知道,这个问题似乎和以前问过几千次的问题是一样的。 但不,这不是真的-至少我认为是这样。在

我使用IronPython并希望调用C方法:

bool GetClassInstance<T>(out T myClassInstance)

通过python调用此函数如下所示:

^{pr2}$

问题是以下错误消息:

expected StrongBox[ClassType], got NoneType (ArgumentTypeException)

现在我有两个问题:

  • 有可能让它运行吗?在
  • 怎么了???在

非常感谢!!在


Tags: 方法函数消息错误outboolexpectedironpython
2条回答

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)和{}值的定义顺序。在

ref参数的情况下,传入参数,它仍将返回到元组中。对象上的任何突变都将按预期工作。在

例如

>>> from System import Int32
>>> Int32.TryParse('12345')
(True, 12345)
>>> Int32.TryParse('12345x')
(False, 0)

我做了一个测试,这样你就可以知道如何称呼不同的变体。在

^{pr2}$
>>> 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属性访问该值。在

>>> outval = clr.Reference[int]()
>>> Test.Test1(outval)
>>> outval
<System.Int32 object at 0x000000000000002B [1]>
>>> outval.Value
1

相关问题 更多 >