2种方法使用2种相同类型的泛型

Ric*_*chK 5 c# generics

如果我有一个如下课程:

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因为调用模糊而试图将其称为错误,这当然是正确的.但是如果通过反射或其他动态方式调用该方法会怎样.我想它会在运行时抛出异常.所以我的问题是为什么编译器允许我创建具有相同类型的类,如果有异常等待发生?

djd*_*d87 4

编译器关心实际的歧义性,并且不会突出显示与重载泛型方法相关的任何歧义性。

如果您不想允许这样做,不幸的是没有办法添加通用类型约束,即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)