如果我有一个如下课程:
class MyClass<T,U>
{
public void DoSomething(T t)
{
}
public void DoSomething(U u)
{
}
}
Run Code Online (Sandbox Code Playgroud)
但是使用相同的类型构造它(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");
}
}
Run Code Online (Sandbox Code Playgroud)
您应该做的是使用不同的名称,以便两个方法名称不会相互冲突。这是在这种情况下最安全的工作方式:
public DoSomethingWithFirst()
{
// For T
}
public DoSomethingWithSecond()
{
// For U
}
Run Code Online (Sandbox Code Playgroud)