基于通用约束的方法重载?

Bor*_* B. 15 c# generics

我可以以某种方式重载方法,只有通用类型约束不同

这不编译:

    void Foo<T>(T bar) where T : class
    {

    }

    void Foo<T>(T bar) where T : struct
    {

    }
Run Code Online (Sandbox Code Playgroud)

由于这些是"开放"方法,因此实际方法应该在具有类型的代码的其他地方引用时关闭/构造/完全定义T,然后将清楚调用哪个重载.

显而易见的解决方案不是让它们超载,但我想知道为什么这在C#中不起作用?

附加问题:如果这只是一个C#编译器约束,IL是否允许这样的重载?

Jon*_*eet 10

我可以以某种方式重载方法,只有通用类型约束不同?

不.就重载而言,它不是方法签名的一部分,就像返回类型不是.

在某些情况下,存在可怕的"伪重载"方式,但我不建议沿着这条路走下去.

有关更多信息,您可能需要阅读:

  • @JonSkeet:我和你一样讨厌传递一个虚拟参数,但在方法的语义应该相同的情况下,无论参数类型如何(例如`bool TryConvert&lt;T&gt;(o as Object, out T result)`)编译器在 struct-only、class-only 和通用方法之间自动选择似乎比要求调用代码使用不同的名称更清晰(特别是因为如果使用较慢的通用方法,而本可以使用更快的通用方法,则不会进行诊断推断)。 (2认同)

Ode*_*ded 5

这是不可能的.

出于重载的目的,通用约束不被视为方法签名的一部分.

如果要同时允许值类型和引用类型,为什么要限制?

  • 为了避免跳过`if(typeof(T)...`(可以/应该静态解析btw。并优化掉)的圈套。此外,它不仅仅是类/结构组合,它也是`where T:Foo/其中 T:Bar`。 (2认同)