7

在 C++ 模板中,您可以将值作为参数传递给函数的模板。我怎样才能在 C# 中做同样的事情?

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

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

但在 C# 中。我怎样才能做到这一点?

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

4

3 回答 3

5

C# 泛型不像 C++ 模板那样。它们仅适用于类型而不适用于值。

于 2013-08-20T00:16:53.383 回答
4

但在 C# 中。我怎样才能做到这一点?

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

正如Daniel 解释的那样,这是不可能通过泛型实现的。

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

于 2013-08-20T00:28:36.957 回答
0

你试图让编译器做你的代码在运行时应该做的事情。

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

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

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

于 2013-08-20T01:46:01.957 回答