不允许重载泛型类型参数?

Abe*_*bel 5 .net c# generics clr

这是好奇心的一部分,因为我只想尝试使用它.如果您具有以下定义,则编译器不允许这样做,因为它表示已定义成员.不允许泛型类型参数的独占重载的原因是什么?

void Get<T>() where T: struct {}
void Get<T>() where T: class {}
Run Code Online (Sandbox Code Playgroud)

在我看来,这没有固有的问题.有人可能会争辩说,在定义重叠的情况下,编制者应该选择哪一个并不总是很清楚(但是普通分辨率似乎最先具体匹配).

有人可以帮助我理解或指向资源禁止这种情况的原因是什么?

the*_*oop 9

Eric Lippert已经在关于通用约束和方法签名的博客文章中回答了这个问题:http://blogs.msdn.com/b/ericlippert/archive/2009/12/10/constraints-are-not-part-of-该-signature.aspx

泛型类型的约束不是CLR中方法签名的一部分,因此您不能有两种方法仅在泛型类型约束方面有所不同.如果没有CLR支持,让C#以与其他.NET语言兼容的合理方式支持这些将是非常繁琐的.

  • @Abel:thecoop是正确的; 这是CLR的限制.理论上,我们当然可以将约束作为签名的一部分,这在您的具体情况下肯定会有所帮助.但在一般情况下,它提出了很多问题.例如:`void M <T>()其中T:IFoo {}`和`void M <T>()其中T:IBar {}`将是不同的方法签名; 那么什么方法是`M <Blah>`其中`Blah`是一个实现`IFoo`和`IBar`的类?处理模糊签名的规则已经足够复杂; 让我们不要添加一些新的方式来模糊. (4认同)