无法将对象转换为 vb.net 中的字符串数组,但我可以在 C#.net(核心)中

Cannot convert an object to a string-array in vb.net but I can in C#.net (core)

我无法在 VB.net 中将对象转换为字符串数组(或集合),我可以在 C# 中做到。

VB.net代码:

Runtime.PythonDLL = "/usr/lib/python3.9/config-3.9-x86_64-linux-gnu/libpython3.9.so"
Using Py.GIL
    Dim APT As Object = Py.Import("apt")
    Dim Cache As Object = APT.Cache()
    Dim PyObj As Object = Cache.keys()
    Dim PKGs As String() = CType(PyObj, String())
End Using

我得到异常 Unable to cast object of type 'Python.Runtime.PyObject' to type 'System.String[]'.

有效的 C#.net 代码:

Runtime.PythonDLL = "/usr/lib/python3.9/config-3.9-x86_64-linux-gnu/libpython3.9.so";
using (Py.GIL())
{
    dynamic APT = Py.Import("apt");   // Type: dynamic {Python.Runtime.PyModule}, <module 'apt' from '/usr/lib/python3/dist-packages/apt/__init__.py'>
    dynamic Cache = APT.Cache();      // Type: dynamic {Python.Runtime.PyModule}, <apt.cache.Cache object at 0x7fa701ec6760>
    dynamic PyObj = Cache.keys();     // Type: dynamic {Python.Runtime.PyModule}, ['0ad', '0ad-data',...]
    String[] PKGs = (String[])PyObj;
}

我在 vb.net 和 C#.net 的调试器中看到了相同的结果。

vb.net 中的调试器:

C#.net 中的调试器:

我知道我在 C# 中使用 dynamic 类型,在 VB 中使用 Object。我确实在 VB 中使用选项 strict=Off。 据我所知,VB 没有 dynamic,但我假设如果 strict=Off,您可以使用 Object。 也许这就是原因,但这是不可能的?

我也尝试转换为:

尝试了 TryCastDirectCastCType.

除了@Jeroen Mostert 的解决方案,我更喜欢它,因为它更通用,我确实在 Python.net 库中找到了一个方法来完成这项工作:pyObject.As<T>()

Runtime.PythonDLL = "/usr/lib/python3.9/config-3.9-x86_64-linux-gnu/libpython3.9.so"
Using Py.GIL
   Dim APT As Object = Py.Import("apt")
   Dim Cache As Object = APT.Cache()
   Dim PyObj As PyObject = Cache.keys()
   Dim PKGs As String() = PyObj.As(Of String())() '<==========
   Console.WriteLine(PKGs(0))
End Using
PythonEngine.BeginAllowThreads() 'Must be called to release the Py.GIL thread!