C# 如何正确管理C中量子位的生存期#

C# 如何正确管理C中量子位的生存期#,c#,q#,C#,Q#,我在玩Q#,它使用C#作为驱动程序。我想将一个量子位对象传递给Q代码,但它没有按预期工作 司机 使用Microsoft.Quantum.Simulation.Core; 使用Microsoft.Quantum.Simulation.Simulator; 命名空间Quantum.QSharpApplication1{ 类驱动程序{ 静态void Main(字符串[]参数){ 使用(var sim=new QuantumSimulator()){ var x=新的Microsoft.Quantum.

我在玩Q#,它使用C#作为驱动程序。我想将一个量子位对象传递给Q代码,但它没有按预期工作

司机

使用Microsoft.Quantum.Simulation.Core;
使用Microsoft.Quantum.Simulation.Simulator;
命名空间Quantum.QSharpApplication1{
类驱动程序{
静态void Main(字符串[]参数){
使用(var sim=new QuantumSimulator()){
var x=新的Microsoft.Quantum.Simulation.Common.QubitManager(10);
Qubit q1=x.Allocate();
求解.运行(sim,q1,1);
}
System.Console.WriteLine(“按任意键继续…”);
System.Console.ReadKey();
}
}
}
Q#

当我运行它时,它会毫无错误地运行,直到它到达System.Console.*行,在这一点上它会在Q代码中抛出以下异常

System.AccessViolationException
HResult=0x80004003
消息=尝试读取或写入受保护内存。这通常表示其他内存已损坏。
来源=
堆栈跟踪:
调试器将其与q#中的“let qp=M(q);”行相关联


请注意,这确实发生在Solve.Run调用中,实际代码有多个Solve调用,并且输出看起来正确。它仅在离开using QuantumSimulator作用域后出现。我记得读到过,量子位元在释放之前必须重置为零。我不确定这是否是问题所在,但我在C#中找不到这样做的方法。有趣的是,如果我删除控制台行,程序将无错误地运行(计时?)。

用于创建量子比特的
QubitManager
实例不是一个单一实例(每个
模拟器
都有自己的
QubitManager
),因此,
模拟器
没有意识到您试图对Q代码进行操作的
量子位
,因此,
AccessViolationException

通常,不支持在驱动程序上创建量子位;您可以在Q#中使用语句。建议在Q#中创建一个入口点,以分配进行量子位分配的量子位,并从驱动程序调用该入口点,例如:

// MyOp.qs
operation EntryPoint() : () 
{
    body
    {
        using (register = Qubit[2]) 
        {
            myOp(register);
        }
    }
}


// Driver.cs
EntryPoint.Run().Wait();
最后,请注意,在驱动程序代码中有以下内容:

求解.运行(sim,q1,1);

Run
方法返回异步执行的任务。通常必须添加一个
Wait()
,以确保它完成执行:

Run(sim,1.Wait();

如果执行此操作,您将注意到在
运行期间发生的故障,而不是
控制台.WriteLine

// MyOp.qs
operation EntryPoint() : () 
{
    body
    {
        using (register = Qubit[2]) 
        {
            myOp(register);
        }
    }
}


// Driver.cs
EntryPoint.Run().Wait();