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

时间:2013-03-12 16:39:19

标签: c# .net generics generic-constraints

我遇到了重载具有不同约束的方法的问题。这是我的例子:

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

    }

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

    }
}

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

3 个答案:

答案 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 {

    }
}