gpt4 book ai didi

c# - 如何将 C# 通用方法调用分派(dispatch)到专用方法调用中

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

我有以下 C# 类:

public class MyType<T>
{
public void TryParse(string p_value)
{
T value ;

Parser.TryParse(p_value, out value);

// Do something with value
}
}

重点是根据泛型类型 T 调用正确的 Parser.TryParse 方法。

这使用了以下静态类:

static public class Parser
{
static public void TryParse(string p_intput, out object p_output)
{
// Do something and return the right value
}

static public void TryParse(string p_intput, out double p_output)
{
// Do something and return the right value
}

static public void TryParse(string p_intput, out int p_output)
{
// Do something and return the right value
}
}

我希望它能工作:在最坏的情况下,将调用“对象”TryParse。相反,我有两个编译错误:

  • CS1502:“Parser.TryParse(string, out object)”的最佳重载方法匹配有一些无效参数
  • CS1503:参数 2:无法从“out T”转换为“out object”

问题 1: 我不明白为什么这不起作用:我可能很天真,但不是所有 C# 对象都应该派生自“object”吗? 为什么T不能转为object?

问题 2: 如何将泛型类型 T 的方法分派(dispatch)到正确的非泛型方法中(即 MyType<T>.TryParse 调用正确的 Parser.TryParse 根据正确类型的 T) ?

注意事项

问题经过编辑以反射(reflect)原始问题的意图(如标题中所写:如何将 C# 泛型方法调用分派(dispatch)到专用方法调用中)

最佳答案

实际上,refout参数不允许类型变化。因此,要将变量传递给需要 out object 的方法参数,该变量必须声明为 object .

来自规范(§10.6.1.2 和 §10.6.1.3)

When a formal parameter is a reference parameter, the corresponding argument in a method invocation must consist of the keyword ref followed by a variable-reference (§5.3.3) of the same type as the formal parameter.

When a formal parameter is an output parameter, the corresponding argument in a method invocation must consist of the keyword out followed by a variable-reference (§5.3.3) of the same type as the formal parameter.

参见:Why do ref and out parameters not allow type variation?了解原因。

Bonus question: How can I dispatch a method with generic type T into the right non-generic methods (i.e. MyType<T>.TryParse calling the right Parser.TryParse according to the right type of T)?

我会把它转回给你。你为什么做这个?如果您正在调用 MyType<T>.TryParse例如,MyType<int>.TryParse , 为什么不打电话 Int32.TryParse直接地?这个额外的层能给您带来什么?

关于c# - 如何将 C# 通用方法调用分派(dispatch)到专用方法调用中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5221724/

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