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

本文关键字:成员 同类型 定义 约束 | 更新日期: 2023-09-27 18:03:37

我遇到了一个重载方法的问题,这些方法具有不同的约束,似乎是排他性的。这就是我的例子:

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

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

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

这不是编译器的限制 -这是语言的限制(很可能还有CLR;我不确定。

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

可以声明方法,使得这些调用都编译成不同方法的调用:

a.Do<int>();
a.Do<string>();
a.Do<int?>();

…但它总是涉及可选参数和/或参数数组,而且很可怕

还要注意,虽然不能通过泛型约束进行重载,但是可以通过泛型的"arity"(类型参数的数量)进行重载:

public void Foo() {}
public void Foo<T>() {}
public void Foo<T1, T2>() {}

不能通过改变泛型参数的包含来重载方法。对于有效的方法重载,您必须为方法提供不同的输入参数。

这两个方法在编译时应该有以下名称:

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 {
    }
}