gpt4 book ai didi

c# - 将委托(delegate)作为类型参数传递并使用它会引发错误 CS0314

转载 作者:太空狗 更新时间:2023-10-29 19:26:39 25 4
gpt4 key购买 nike

我正在尝试将委托(delegate)类型作为类型参数传递,以便稍后在代码中将其用作类型参数,如下所示:

// Definition
private static class Register
{
public static FunctionObject Create<T>(CSharp.Context c, T func)
{
return new IronJS.HostFunction<T>(c.Environment, func, null);
}
}

// Usage
Register.Create<Func<string, IronJS.CommonObject>>(c, this.Require);

但是,C# 编译器会报错:

The type 'T' cannot be used as type parameter 'a' in the generic type or method
'IronJS.HostFunction<a>'. There is no boxing conversion or type parameter
conversion from 'T' to 'System.Delegate'."

我试图通过在函数中附加“where T : System.Delegate”来解决这个问题,但是,您不能将 System.Delegate 用作类型参数的限制:

Constraint cannot be special class 'System.Delegate'

有谁知道如何解决这个冲突?

不起作用(参数和返回类型信息在转换过程中丢失):

Delegate d = (Delegate)(object)(T)func;
return new IronJS.HostFunction<Delegate>(c.Environment, d, null);

最佳答案

如果你看https://github.com/fholm/IronJS/blob/master/Src/IronJS/Runtime.fs你会看到:

and [<AllowNullLiteral>] HostFunction<'a when 'a :> Delegate> =
inherit FO
val mutable Delegate : 'a

new (env:Env, delegateFunction, metaData) =
{
inherit FO(env, metaData, env.Maps.Function)
Delegate = delegateFunction
}

换句话说,您不能使用 C# 或 VB 来编写您的函数,因为它需要使用 System.Delegate 作为类型约束。我建议用 F# 编写函数或使用反射,如下所示:

public static FunctionObject Create<T>(CSharp.Context c, T func)
{
// return new IronJS.HostFunction<T>(c.Environment, func, null);
return (FunctionObject) Activator.CreateInstance(
typeof(IronJS.Api.HostFunction<>).MakeGenericType(T),
c.Environment, func, null);
}

关于c# - 将委托(delegate)作为类型参数传递并使用它会引发错误 CS0314,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6167396/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com