为什么我们不能使用动态方法代替 Generic(T) 方法

Why can't we use dynamic methods instead for Generic(T) methods

我有两个函数定义如下。方法 1 将 return 任何动态类型,方法 2 将 return 泛型类型:

方法一

public dynamic dynamicFun(int n)
        {
            switch (n)
            {
                case 0:
                    return 0;
                case 1:
                    return "N";
                case 2:
                    return 1.3;
                default:
                    return 'v';
            }
        }

方法二:

  public static T genericFun<T>(int n)
        {
            switch (n)
            {
                case 0:
                    return (T)System.Convert.ChangeType(0, Type.GetTypeCode(typeof(T)));
                case 1:
                    return (T)System.Convert.ChangeType("N", Type.GetTypeCode(typeof(T)));
                case 2:
                    return (T)System.Convert.ChangeType(1.3, Type.GetTypeCode(typeof(T)));
                default:
                    return (T)System.Convert.ChangeType('V', Type.GetTypeCode(typeof(T)));
            }
        }

两者都在执行相同的功能。函数调用将在下图中进行描述:

现在我的问题是 ;

为什么我们不能使用动态方法代替 [of] Generic(T) 方法?

在我看来你可以,你的例子和运行时值证明了这一点。但是您在思考示例时存在固有错误:您 知道 泛型方法中返回的是什么类型,因此您以这种方式实例化它。如果我做了 var genericCase1 = genericFun<int>(1),会返回什么?可能会抛出异常,因为 "N" 不是整数。

这两种方法有什么区别?

动态在运行时确定,而泛型在编译时解析。

哪里可以使用动态方法,哪里可以使用泛型?

我猜你可以在任何地方使用一种方法。你会使用一个而不是另一个的原因实际上是基于你所处的情况。如果你不知道在撰写本文时将返回给你的确切类型,那么请走动态路线。当您知道要处理几个具有特定方法的不同 base/super classes 时,您可以使用它,并且您想要使用该方法,但您不关心哪个派生 class 从动态方法返回。

泛型可用于避免为相同功能编写大量重载。如果你知道你想对许多不同的东西执行相同的操作,那么创建一个通用方法,并在你的写作过程中传递你想要做的事情的类型。使用类型约束也非常棒,因为现在您可以限制哪些类型可以调用此泛型方法,并在编译时发现任何问题。

泛型比动态有什么优势吗?

正如其他人在评论中所说,存在时间问题,一种方法可能比另一种方法花费更长的时间,但我想其中的一部分将取决于实现的方法,以及 JIT 与编译器的工作量要做。

泛型还允许类型安全和减少错误,因为它们是在编译时解决的。泛型也可能更容易维护,因为没有那么多 "magic" 进行。

您可能应该谨慎使用动态,因为尽管它们很强大,但使用不当可能会导致许多不眠之夜的调试。


如果我在这方面有任何错误,请有人纠正我。和我们大多数人一样,我也在学习,希望就我目前理解的任何问题提供反馈。

泛型的一大优点是您可以指定 T 的类型。例如void doSomething<T> () where T : abstractParentClass