【发布时间】:2019-10-02 11:39:23
【问题描述】:
我正在使用基于 C# 的量子编程语言 Q#。量子操作变成了 C# 类,你可以从中做一些事情,比如
QuantumOperation.run(simulator, param1, param2);
它将使用量子模拟器 simulator 运行带有参数 param1 和 param2 的操作 QuantumOperation。
我有许多不同的操作,我想使用不同的模拟器和不同的参数来运行它们。我想做的是将量子操作传递给另一种方法,该方法将遍历所有模拟器和参数。然后我可以用我想要的所有量子操作调用这个方法。
问题在于——据我所知——量子运算实际上是一个类,而不是一个对象。所以,例如,如果我写:
static void someMethod<Qop>(){...}
然后我可以使用量子操作QuantumOperation 将其称为:
someMethod<QuantumOperation>()
它编译得很好。但是,如果我尝试做类似
static void someMethod<Qop>(Qop quantumOperation){ ...}
someMethod<QuantumOperation>(quantumOperation);
第二行出现“QuantumOperation 是一种类型,在给定上下文中无效”的错误。
如果我尝试:
static void someMethod<Qop>(...){
...
Qop.Run(...);
...
}
它类似地表示:“'Qop' 是一个类型参数,在给定的上下文中无效”。
这里似乎发生的事情是我将类作为一种类型传递。但是当我想将类型视为一个类时,我不能。我寻找将类作为参数传递的方法,但我只看到了在该类中创建对象的方法。但我不能使用对象,因为“运行”是一种静态方法。
(我可以尝试传递一个对象并从中获取类,但是(a)我不知道是否可以创建量子操作类的对象,并且(b)我只能找到public Type GetType,返回一个类型而不是一个类,给出同样的问题)。
有没有办法将一个类作为参数传递,然后引用该类的静态方法,而无需实例化对象?
现在,也许我问的太多了,因为就 C# 而言,所有这些类都有一个名为“Run”的方法是一个巧合。它可能不应该能够尝试从不同的类中调用具有相同名称的方法。
或者,我可以为每个量子操作构造一个方法,然后传递这些方法。该方法如下所示:
static void QuantumOperationWrapper(QuantumSimulator simulator, Int int_parameter){
QuantumOperation.Run(simulator, in_parameter);
}
我需要为每个量子操作创建一个新方法,但这还不错。然后我可以将它作为委托或 Func 传递给我想要的方法。问题是我想要的结果包含在QuantumSimulator 对象中。所以我想做的是:
QuantumOperationWrapper(simulator, 3);
simulator.GetResults();
但是当我这样做时,结果是空的。我的猜测是,不知何故,模拟器是按值传递的,或者被视为不可变的,或者阻止QuantumOperationWrapper 改变模拟器的内部参数的东西。
有什么方法可以确保委托/Func 会改变其参数的内部状态?
编辑:我可以为 Run 方法创建一个委托,如下所示:
public delegate System.Threading.Tasks.Task<Microsoft.Quantum.Simulation.Core.QVoid> RunQop(QCTraceSimulator sim, long n);
然后我可以构造static void someMethod(RunQop runner, ...),并将QuantumOperation.Run 作为第一个参数传递。
但是,我有同样的问题,我作为参数传递的 QCTraceSimulator 没有保留它在调用它时所做的任何模拟结果。
【问题讨论】:
-
在 C# 中有这些东西称为“委托”。每个方法都是一个委托,(更多阅读here,您可以使用委托作为参数,允许您将方法作为参数传递给方法。如果您可以发布
QuantumOperation.run()的方法签名,我可以给您一个委托来传递它作为参数 -
如何找到方法签名?
-
方法签名表示方法的名称、参数、返回类型和访问修饰符。要创建委托,您需要返回类型和参数。查看docs.microsoft.com/en-us/dotnet/csharp/programming-guide/…
-
给定方法的方法签名是它被声明的地方。例如
ToString方法的方法签名是public string ToString(); -
好的,我想出了方法签名并尝试了它,但它没有存储结果(我编辑了问题以包含更多详细信息)
标签: c# types static-classes quantum-computing q#