首页 > 解决方案 > 我可以在 C# 中约束构造函数参数吗

问题描述

说我有

public enum DataFlow{
     Input,
     Output
}

public interface IPort{
  DataFlow Dir{get;}
}


public class Port<T>: IPort
{
  DataFlow Dir{get;}
  T Val;
  public Port(T val, DataFlow dir){
     Val = val;
     Dir = dir;
  }
}
 

public class Link{
       
 public Link(IPort portA, IPort portB){
               
 }
}

在上面的Link类中,有没有办法约束构造函数,使它只接受portA它的Dir属性是DataFlow.OutputportB如果它的Dir属性是DataFlow.Input

像这种虚构的虚构语法之类的东西...

 
 public Link(IPort portA where IPort.Dir is DataFlow.Output, IPort portB where IPort.Dir is DataFlow.Input){
               
 }

我可以通过检查Dir构造函数中的每个内部然后在需要时抛出来做到这一点,但我想知道是否有一种方法可以像[NotNull]and where T :c# 语法那样强制执行

标签: c#

解决方案


不,因为这没有意义。“where”是一个设计时构造,它让编译器在泛型场景中检查类型,并且您正在尝试将其应用于运行时数据设置

我建议您考虑改用打字机制并拥有一个 IInputPort 和一个 IOutputPort,然后您的代码可以稍后检查传入的实现is(如果由于某种原因您不将其存储为 IInputPort/IOutportPort)以了解它是否输入或输出(因为这确实是你要问的——你想确保传递给你的类的东西能够充当例如输入)。当然,您的代码的实现者可以自由设计一个实现两者的类并将其实例传递给每个类


或者,您检查传入的值,如果它不可接受,则抛出一个有意义的异常。希望这将作为使用您的类的设计时过程的一部分,由开发人员在他们的类被放入生产系统的一部分之前进行实现。但它确实推动了实现错误的风险。直到后来软件开发线才被选中(可能在他们对您的代码的 impl 上线之后)


推荐阅读