具有相同签名的成员已使用不同的类型约束定义

Ily*_*dik 6 .net c# generics generic-constraints

我遇到了一个重载方法的问题,这些方法具有看似独占的不同约束.这是我的例子:

public class A
{
    public void Do<T>() where T : class
    {

    }

    public void Do<T>() where T : struct 
    {

    }
}
Run Code Online (Sandbox Code Playgroud)

并且这不会编译时出现以下错误"已定义相同签名的成员".是否有可能同时满足这两个条件,或者仅仅是C#编译器的限制?

Jon*_*eet 9

这不是编译器的限制- 它是语言的限制(很可能也是CLR;我不确定).

从根本上说,这些都是冲突的重载 - 就像试图通过返回类型重载一样.它不受支持.

可能的声明等方法,这些调用所有编译成不同的方法调用:

a.Do<int>();
a.Do<string>();
a.Do<int?>();
Run Code Online (Sandbox Code Playgroud)

...但它总是涉及可选参数和/或参数数组,而且非常糟糕.

另外请注意,尽管你可以不被通用约束超载,您可以通过通用的"元数"(类型参数的数量)过载:

public void Foo() {}
public void Foo<T>() {}
public void Foo<T1, T2>() {}
Run Code Online (Sandbox Code Playgroud)