无法用类型约束重载泛型方法[重复]

Posted

技术标签:

【中文标题】无法用类型约束重载泛型方法[重复]【英文标题】:Inability to overload generic methods with type constraints [duplicate] 【发布时间】:2012-02-19 03:14:12 【问题描述】:

可能重复:Generic constraints, where T : struct and where T : class

是否有特殊原因不能在 C# 中使用互斥类型约束重载泛型方法?例如,采用以下方法:

T DoSomething<T>(T arg) where T : class
 /* Do something */ 

T DoSomething<T>(T arg) where T : struct
 /* Do something */ 

并尝试调用它们

DoSomething("1");
DoSomething(1);

在我看来,DoSomething() 方法就它们将采用的参数而言是互斥的——第一个采用引用类型,第二个采用值类型。编译器应该能够判断带有字符串参数的 DoSomething 调用转到第一个方法,而带有 int 参数的 DoSomething 调用转到第二个方法。

我在这里缺少泛型的概念吗?还是这只是 C# 中未实现的功能?

【问题讨论】:

可以通过添加指向重复答案的链接来改进此重复文本。如果您找不到解决方案并且搜索没有返回任何结果,或者结果太多,那真是令人沮丧。 【参考方案1】:

通用约束不是方法签名的一部分

看到这个答案Generic contraints on method overloads

Jon Skeet blog post on the topic

【讨论】:

此答案中提供的链接目前已损坏(截至 2015 年 4 月 26 日)。 @bostIT 嗯。我想知道 Jon 的博客发生了什么。我看看能不能找到更新的链接。 @bostIT 找到更新并修复链接 我个人认为泛型约束是愚蠢的,clr应该能够根据T自动找出语义。

以上是关于无法用类型约束重载泛型方法[重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用带有约束的泛型时无法隐式转换类型[重复]

C#002 方法和接口

C#002 方法和接口

您可以使用泛型进行方法重载并且只更改方法签名的泛型类型吗?

泛型和从差异类调用重载方法 - 优先级问题[重复]

C#泛型 类型约束