对类型参数的约束,可以有一个可选类型

时间:2015-08-20 17:42:41

标签: c# generics c#-4.0 overloading

我一直在阅读documentation here而我无法实现我所需要的地方 - 类型参数约束的重载。我在技术上"不知道如何打电话,因此我提到了#34;重载"。这是我尝试实现的一个例子:

class Test<T> {
  private Test(string x) {
  }  

  public static Test<T> OpTest(T t) {
    return new Test<T>("test string") {
      Value = t,
    }
  }

  public T Value1 {get;set;}
  public string X {get;set;}
}

// Sample usage
var result = Test<SomeClass>.OpTest(instanceOfSomeClass);

这就是我想要的......

//... that I can do this
var result = Test<SomeClass>.OpTest(instanceOfSomeClass);
//and also sometimes this
var anotherResult = Test<SomeClass, SomeOtherClass>
    .OpTest(instanceOfSomeClass, instanceOfSomeOtherClass);

我能够通过创建另一个具有不同约束的类来实现这一点:

class Test<T, U> : Test<T> {
  private Test(string x):base(x) { }
  public static Test<T, U> OpTest(T t, U u) {
    return new Test<T, U>("test string") {
      Value1 = T,
      Value2 = U,
    }
  }

  public U Value2 {get;set;}
}

虽然这是我想要的方式,但我觉得有些不对劲。是吗?或者有更好的方法吗?此外,我只是觉得不对,但我现在必须在Test<T>Test<T,U>之间复制(复制+粘贴)某些逻辑。

1 个答案:

答案 0 :(得分:1)

干嘛写的方式:

class Test<T> {
  private Test(string x) {
  }  

  public static Test<T> OpTest(T t) {
    return new Test<T>("test string") {
      Value1 = t,
    }
  }

  public T Value1 {get;set;}
  public string X {get;set;}
}

class TestExtra<T, U> : Test<T> {
  private TestExtra(string x) : base(x) {
  }  

  public static TestExtra<T, U> OpTestExtra(T t, U u) {
    return new Test<T>("test string") {
      Value1 = t,
      Value2 = u
    }
  }

  public U Value2 {get;set;}
}


var result = Test<SomeClass>.OpTest(instanceOfSomeClass);
var anotherResult = TestExtra<SomeClass, SomeOtherClass>
    .OpTestExtra(instanceOfSomeClass, instanceOfSomeOtherClass);