c# - 我可以在 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.Output
,portB
如果它的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# 语法那样强制执行
解决方案
不,因为这没有意义。“where”是一个设计时构造,它让编译器在泛型场景中检查类型,并且您正在尝试将其应用于运行时数据设置
我建议您考虑改用打字机制并拥有一个 IInputPort 和一个 IOutputPort,然后您的代码可以稍后检查传入的实现is
(如果由于某种原因您不将其存储为 IInputPort/IOutportPort)以了解它是否输入或输出(因为这确实是你要问的——你想确保传递给你的类的东西能够充当例如输入)。当然,您的代码的实现者可以自由设计一个实现两者的类并将其实例传递给每个类
或者,您检查传入的值,如果它不可接受,则抛出一个有意义的异常。希望这将作为使用您的类的设计时过程的一部分,由开发人员在他们的类被放入生产系统的一部分之前进行实现。但它确实推动了实现错误的风险。直到后来软件开发线才被选中(可能在他们对您的代码的 impl 上线之后)
推荐阅读
- sql - 如何使用 substr/regex 函数验证过滤器并从 Oracle PLSQL 中的存储过程中获取结果?
- c# - 实体框架代码首先添加 DbSet 属性
- r - 在 R 中:如何从第 N 个单元格中获取值并从第 N 列中的每个单元格中减去
- python - 索引超出列表范围?
- python - 如何在 for 循环中找到导致错误的对象?
- ruby-on-rails - 如何修复源映射错误:错误:必须对部分偏移进行排序且不重叠
- visual-studio-code - 用于检测的正则表达式!这不起作用
- c++ - 如何在 C++ 中设置 Actor 的“渲染自定义深度通道”和“深度模板值”?
- beautifulsoup - 刚刚在 IDLE PyCharm 中消失的超大文本
- python - 如何修复不支持的操作数类型错误?