gpt4 book ai didi

C#泛型方法选择

转载 作者:行者123 更新时间:2023-12-03 15:59:24 24 4
gpt4 key购买 nike

我正在尝试用 C# 编写可以处理不同维度几何实体的通用算法。

在下面的人为示例中,我有 Point2Point3 , 都实现了一个简单的 IPoint界面。

现在我有一个函数GenericAlgorithm调用函数GetDim .该函数根据类型有多种定义。还有一个为实现 IPoint 的任何东西定义的回退函数。 .

我最初预计以下程序的输出是 2、3。但是,它是 0、0。

interface IPoint {
public int NumDims { get; }
}

public struct Point2 : IPoint {
public int NumDims => 2;
}

public struct Point3 : IPoint {
public int NumDims => 3;
}

class Program
{
static int GetDim<T>(T point) where T: IPoint => 0;
static int GetDim(Point2 point) => point.NumDims;
static int GetDim(Point3 point) => point.NumDims;

static int GenericAlgorithm<T>(T point) where T : IPoint => GetDim(point);

static void Main(string[] args)
{
Point2 p2;
Point3 p3;
int d1 = GenericAlgorithm(p2);
int d2 = GenericAlgorithm(p3);
Console.WriteLine("{0:d}", d1); // returns 0 !!
Console.WriteLine("{0:d}", d2); // returns 0 !!
}
}

好的,所以由于某种原因, GenericAlgorithm 中的具体类型信息丢失了。 .我不完全理解为什么会发生这种情况,但是很好。如果我不能这样做,我还有什么其他选择?

最佳答案

这种方法:

static int GenericAlgorithm<T>(T point) where T : IPoint => GetDim(point);

... 将始终调用 GetDim<T>(T point) .重载决议是在编译时执行的,在那个阶段没有其他适用的方法。

如果您希望在执行时调用重载决议,则需要使用动态类型,例如

static int GenericAlgorithm<T>(T point) where T : IPoint => GetDim((dynamic) point);

但是为此使用继承通常是一个更好的主意-在您的示例中,显然您可以只使用单个方法并返回 point.NumDims .我假设在您的真实代码中,有一些原因等效于做起来比较棘手,但是如果没有更多上下文,我们无法建议如何使用继承来执行特化。这些是您的选择:
  • 基于目标执行时类型的特化继承(首选)
  • 执行时重载解析的动态类型
  • 关于C#泛型方法选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60409002/

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