繁体   English   中英

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

[英]Are there any issues with having a non-generic method in a generic class?

在 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;
    }
}

出于所有意图和目的,M 不是通用的吗?

如果您使用反射来检查这些方法,您会发现IsGenericMethodIsGenericMethodDefinition对于AG为真,而对于Generic<>.M为假。 即使Generic<>.M的返回类型是T ,它的IsGenericParameter属性是 true,也是如此。

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

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

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

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

在泛型类中使用像M这样的非泛型方法没有“问题”。 这就是泛型类的工作方式。 请注意我上面提到的行为差异。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM