代码之家  ›  专栏  ›  技术社区  ›  username128437855

在泛型类中使用非泛型方法是否有任何问题?

  •  1
  • username128437855  · 技术社区  · 2 年前

    在MSDN上( https://docs.microsoft.com/en-us/dotnet/standard/generics/ ),它说:

    泛型方法可以出现在泛型或非泛型类型上。重要的是要注意,方法不是泛型的,仅仅因为它属于泛型类型,或者甚至因为它具有形式参数,其类型是封闭类型的泛型参数。只有当方法有自己的类型参数列表时,它才是泛型的。在下面的代码中,只有方法G是泛型的。

    难道M不是所有的意图和目的都是通用的吗?如果在T类型的某个实例上调用方法M,M只能具有T类型的输入和输出参数。 使用这种非广义方法M会有什么问题吗?

    class A
    {
        T G<T>(T arg)
        {
            T temp = arg;
            //...
            return temp;
        }
    }
    class Generic<T>
    {
        T M(T arg)
        {
            T temp = arg;
            //...
            return temp;
        }
    }
    
    1 回复  |  直到 2 年前
        1
  •  3
  •   StriplingWarrior    2 年前

    难道M不是所有的意图和目的都是通用的吗?

    如果使用反射来检查这些方法,您会发现 IsGenericMethod IsGenericMethodDefinition 适用于 A.G ,对于为false Generic<>.M . 这是真的,尽管 通用(<>。M 的返回类型为 T 谁的 IsGenericParameter 属性为true。

    您提出了一个关于语义的问题(即“泛型方法”的语言含义),Microsoft已经定义了这些概念的含义,因为它们与C#有关。所以,当微软说泛型方法是一种接受泛型类型参数的方法时,这就是开发人员和框架本身都会接受的定义。

    如果在T类型的某个实例上调用方法M,M只能具有T类型的输入和输出参数。

    是的,区别在于类型的范围 T . 例如,如果您有 Generic<string> ,您无法传递其 M int . 使用泛型方法,可以在方法级别更改泛型参数,而泛型类上的非泛型方法使用与其所属类的泛型类型匹配的类型。

    使用这种非广义方法M会有什么问题吗?

    使用非泛型方法没有“问题”,例如 M 泛型类内部。这就是泛型类的工作方式。请注意我上面提到的行为差异。