gpt4 book ai didi

c# - 是否存在将我的泛型方法限制为数字类型的约束?

转载 作者:IT王子 更新时间:2023-10-29 03:28:02 53 4
gpt4 key购买 nike

谁能告诉我是否有一种方法可以使用泛型将泛型类型参数 T 限制为仅:

  • Int16
  • Int32
  • Int64
  • UInt16
  • UInt32
  • UInt64

我知道 where 关键字,但找不到这些类型的接口(interface),

类似于:

static bool IntegerFunction<T>(T value) where T : INumeric 

最佳答案

十多年后,这个功能终于存在于 .NET 7 中。最通用的接口(interface)是 INumber<TSelf> 而不是 INumeric(在 System.Numerics 命名空间中),它不仅包含整数类型。要仅接受整数类型,请考虑改用 IBinaryInteger<TSelf> 。使用您的原型(prototype)、神秘的 IntegerFunction 示例:

static bool IntegerFunction<T>(T value) where T : IBinaryInteger<T> {
return value > T.Zero;
}
Console.WriteLine(IntegerFunction(5));         // True
Console.WriteLine(IntegerFunction((sbyte)-5)); // False
Console.WriteLine(IntegerFunction((ulong)5)); // True

下面的(现已过时的)答案保留为历史观点。

C# 不支持这个。 Hejlsberg 描述了未实现功能 in an interview with Bruce Eckel 的原因:

And it's not clear that the added complexity is worth the small yield that you get. If something you want to do is not directly supported in the constraint system, you can do it with a factory pattern. You could have a Matrix<T>, for example, and in that Matrix you would like to define a dot product method. That of course that means you ultimately need to understand how to multiply two Ts, but you can't say that as a constraint, at least not if T is int, double, or float. But what you could do is have your Matrix take as an argument a Calculator<T>, and in Calculator<T>, have a method called multiply. You go implement that and you pass it to the Matrix.

然而,这会导致相当复杂的代码,用户必须为他们想要使用的每个 Calculator<T> 提供他们自己的 T 实现。只要它不必是可扩展的,即如果您只想支持固定数量的类型,例如 intdouble ,您可以使用相对简单的接口(interface):

var mat = new Matrix<int>(w, h);

( Minimal implementation in a GitHub Gist. )

但是,一旦您希望用户能够提供他们自己的自定义类型,您就需要打开此实现,以便用户可以提供他们自己的 Calculator 实例。例如,要实例化一个使用自定义十进制浮点实现 DFP 的矩阵,您必须编写以下代码:

var mat = new Matrix<DFP>(DfpCalculator.Instance, w, h);

...并实现 DfpCalculator : ICalculator<DFP> 的所有成员。

不幸的是,另一种方法具有相同的局限性,即使用策略类 as discussed in Sergey Shandar’s answer

关于c# - 是否存在将我的泛型方法限制为数字类型的约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32664/

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