Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 类型参数上的约束,是否可以有可选类型_C#_Generics_C# 4.0_Overloading - Fatal编程技术网

C# 类型参数上的约束,是否可以有可选类型

C# 类型参数上的约束,是否可以有可选类型,c#,generics,c#-4.0,overloading,C#,Generics,C# 4.0,Overloading,我一直在阅读,但我无法达到我所需要的目标——有点像类型参数约束的重载。我“技术上”不知道怎么称呼它,所以我提到了“过载”。下面是我试图实现的一个例子: class Test<T> { private Test(string x) { } public static Test<T> OpTest(T t) { return new Test<T>("test string") { Value = t, } }

我一直在阅读,但我无法达到我所需要的目标——有点像类型参数约束的重载。我“技术上”不知道怎么称呼它,所以我提到了“过载”。下面是我试图实现的一个例子:

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);
类测试{
专用测试(字符串x){
}  
公共静态测试OpTest(T){
返回新测试(“测试字符串”){
值=t,
}
}
公共T值1{get;set;}
公共字符串X{get;set;}
}
//样本使用
var result=Test.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);
/。。。我能做到这一点
var result=Test.OpTest(instanceOfSomeClass);
//有时也会这样
var另一个结果=测试
.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;}
}
类测试:测试{
私有测试(字符串x):基(x){}
公共静态测试OpTest(T,U){
返回新测试(“测试字符串”){
值1=T,
值2=U,
}
}
公共U值2{get;set;}
}
虽然这是我想要的方式,但我觉得有些事情不对劲。它是?还是有更好的方法?此外,我不仅不觉得这是错误的,而且现在我必须在
Test
Test
之间复制(复制+粘贴)一些逻辑来编写它:

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);
类测试{
专用测试(字符串x){
}  
公共静态测试OpTest(T){
返回新测试(“测试字符串”){
值1=t,
}
}
公共T值1{get;set;}
公共字符串X{get;set;}
}
TestExtra类:测试{
私有TestExtra(字符串x):基(x){
}  
公共静态测试xtra OpTestExtra(T,U){
返回新测试(“测试字符串”){
值1=t,
值2=u
}
}
公共U值2{get;set;}
}
var result=Test.OpTest(instanceOfSomeClass);
var anotherResult=TestExtra
.OpTestExtra(instanceOfSomeClass,instanceOfSomeOtherClass);

考虑到有多少
Func
重载,为每个预期数量的类型创建重载类没有什么错。但是,在C#6中没有类似可选类型参数的选项。听起来您可能正在寻找可变类型参数支持,这在C#中目前是不可能的。像rbaghbanli的回答中那样干涸代码是您目前所能期望的最好结果。请参阅:更多信息。感谢链接@TyreeJackson。第一个是有意义的。我想我会坚持我现在所拥有的,直到一个聪明的方法被发现(如果有的话)。是的,遗产已经到位,这不是我真正想要的。谢谢你的提示,但我已经意识到了;)我真正想要的是那些我必须在每个新的“重载类”中创建的方法签名,以及它们之间的代码。现在,我将采用@ronbeyer提到的创建重载类的方法。任何其他想法都是受欢迎的。如果您关心TestOp代码重复变量设置,它可以进一步干燥。如果不使用工厂方法,您将使用构造函数或setter方法,然后使用base(x,y,…)作为构造函数或base.set(x,y,…)作为setter方法,您将获得更少的代码重复。