【问题标题】:How to pass a value to a C# generic?如何将值传递给 C# 泛型?
【发布时间】:2013-08-21 21:53:50
【问题描述】:

在 C++ 模板中,您可以将值作为参数传递给 template of a function。如何在 C# 中做同样的事情?

例如,我想做类似以下的事情:

template <unsigned n> struct Factorial {
     enum { 
        result = n * Factorial<n - 1>::result;
     };
};
template <> struct Factorial<0> {
      enum {
        result = 1;
      };
};

但在 C# 中。我该怎么做?

顺便说一句,我对它们的实际需求涉及按需生成类(更改了一些静态值),因此提供的代码只是一个示例。

【问题讨论】:

  • 这是否等同于通用方法?我对 C++ 一无所知。
  • 不,模板允许传入值,而泛型只允许类型。我正在寻找一种解决方法来实现将值作为模板参数传递的相同效果,但在 C# 中(不允许这样做)
  • 我看不出这在面向对象的方法中有什么用处。
  • 您能否更具体地说明您想要生成哪些类以及为什么?
  • 可以在 C#/.Net 中通过 Emit 或 Code Dom 生成类(链接stackoverflow.com/questions/7769287/…)...但是如果您指定您的实际问题(“像克隆 Unity 接口拦截器”),则可能是其他方法。

标签: c# .net generics


【解决方案1】:

您正试图让编译器执行您的代码在运行时应该执行的操作。

是的,这在 C++ 中是可能的。在 C# 中,它不是。相当于您在 C# 中的代码是:

public class Factorial
{
    public static ulong Compute(ulong n)
    {
        if (n == 0)
            return 1;
        return n * Factorial.Compute(n - 1);
    }
}

请注意,虽然静态代码已经严重违反了 OOP 原则(但有时是必要的),但使用基于值的模板更糟糕。您的类型应该依赖于其他类型,这可以使用泛型。它们不应依赖于具体的价值观。

【讨论】:

    【解决方案2】:

    但在 C# 中。我该怎么做?

    顺便说一句,我对它们的实际需求涉及按需生成类(更改了一些静态值),因此提供的代码只是一个示例。

    作为Daniel explained,这是不可能通过泛型实现的。

    一种可能的替代方法是使用T4 Templates。根据您的需要,您可能会在编译时根据模板生成类,这听起来可能满足您的需求。

    【讨论】:

      【解决方案3】:

      C# 泛型与 C++ 模板不同。它们仅适用于类型而不适用于值。

      【讨论】:

      • @pretobomba 你可以把阶乘写成递归函数。
      • 嘿嘿嘿,我对它们的实际需求涉及按需生成类(更改了一些静态值)。递归函数适用于我给出的示例,但它不是泛型限制的完整解决方法。
      • 我对它们的实际需求涉及按需生成类(更改了一些静态值) - 这是您的实际问题还是其他问题的解决方案在 C# 中采用不同的方法?
      • @pretobomba 请详细说明您的具体问题。
      • @DanielA.White 如何在 C# 中实现与在 C++ 中向模板传递值相同的效果?
      猜你喜欢
      • 1970-01-01
      • 2013-06-07
      • 2022-11-23
      • 1970-01-01
      • 2016-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多