我遇到了重载具有不同约束的方法的问题。这是我的例子:
public class A
{
public void Do<T>() where T : class
{
}
public void Do<T>() where T : struct
{
}
}
这不会编译时出现以下错误“已定义相同签名的成员”。是否有可能同时满足这两个条件,或者仅仅是C#编译器的限制?
答案 0 :(得分:8)
它不是编译器的限制 - 它是语言的限制(很可能也是CLR; I&#39 ;我不确定。)
从根本上说,这些都是冲突的重载 - 它就像试图通过返回类型重载一样。它不受支持。
可以声明方法,使这些调用全部编译为不同方法的调用:
a.Do<int>();
a.Do<string>();
a.Do<int?>();
...但它总是涉及可选参数和/或参数数组,它是horrible。
另请注意,虽然您不能通过通用约束进行重载,但可以>> 过载通用&#34; arity&#34; (类型参数的数量):
public void Foo() {}
public void Foo<T>() {}
public void Foo<T1, T2>() {}
答案 1 :(得分:2)
您不能通过改变通用参数约束来重载方法。对于有效的方法重载,您必须为方法提供不同的输入参数。
答案 2 :(得分:1)
编译时,这两种方法都应具有以下名称:
A.Do``1
因为泛型参数的数量会进入方法或类的名称。
不确定您的情况,但您可能需要使用反射来调用这些方法:
public class A
{
public void Do<T>()
{
if(typeof(T).IsValueType){
// nasty reflection to call DoValueType
}
else {
// nasty reflection to call DoReferenceType
}
}
private void DoReferenceType<T>() where T : class {
}
private void DoValueType<T>() where T : struct {
}
}