c# - 2 种方法使用 2 个相同类型的泛型

标签 c# generics

如果我有如下类:

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/

相关文章:

c# - 无法将指针数组放入 C# 中的不安全结构的根本原因是什么?

c# - Visual Studio 表适配器配置向导无法解析 mysql 语句

c# - 将动态控件插入控件集合的中间

java - Java 中 CRTP 的替代方案

java - 可以采用数组和数组列表的通用方法

通用基类具体实现的c#工厂

c# - 由于不明原因,Unity iOS应用程序崩溃

c# - INSERT 语句与 FOREIGN KEY 约束冲突“FK_

objective-c - 指定 NSDictionary 条目的值类型

java - 根据参数化类型从工厂检索实例