如果我有如下类:
class MyClass<T,U>
{
public void DoSomething(T t)
{
}
public void DoSomething(U u)
{
}
}
但使用相同的类型构造它 ( new MyClass<int,int>()
)
这编译得很好,但如果我尝试调用 DoSomething
它由于调用不明确而出错,这当然是正确的。但是,如果该方法是通过反射或其他动态方式调用的呢?我猜它会在运行时抛出异常。所以我的问题是,如果有异常等待发生,为什么编译器允许我创建具有相同类型的此类?
最佳答案
编译器关心的是实际的歧义,不会突出显示与重载泛型方法相关的任何歧义。
如果您不想允许这样做,不幸的是没有办法添加通用类型约束,即 where T != U
,所以您只需要在构造函数:
public MyClass()
{
if (typeof(T) == typeof(U))
{
throw new Exception("T and U cannot be of the same type");
}
}
您应该做的是使用不同的名称,这样两个方法名称就不会相互冲突。这是在这种情况下最安全的工作方式:
public DoSomethingWithFirst()
{
// For T
}
public DoSomethingWithSecond()
{
// For U
}
关于c# - 2 种方法使用 2 个相同类型的泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3317398/