可选参数可以是空的 class 对象类型而不是空值吗?
Can an optional parameter be an empty class object type and NOT null?
我正在尝试构建一个 'Action' 摘要 class,它将以多种不同的方式使用。在我的例子中,一个动作只是一个简单的可重复任务,由各种 'Triggers' 调用。我还创建了一个 'ActionArgs' class 用作结构来保存要执行的操作的参数。默认 'ActionArgs' 对象不包含任何参数,旨在充当默认值。但是,我希望能够创建从它们各自的父级继承的 'Action's 和 'ActionArgs',但我总是希望基本的空 ActionArgs 对象充当可选参数的默认值,因为一些动作将有参数,其他的可能没有。我在实现这一目标时遇到了问题。我已经尝试了一些东西,但这就是我想要的:
public abstract class Action
{
public string Name { get; private set; }
public Action(string name) { Name = name; }
public abstract bool PerformAction(ActionArgs args = ActionArgs.Empty);
}
public class ActionArgs
{
public static readonly ActionArgs Empty = new ActionArgs();
public ActionArgs() { }
}
在尝试此操作时,我在 PerformAction() 定义中遇到错误,指出默认参数值必须是编译时常量。为什么这不可能在编译时解决?我猜这是因为它假设最坏的情况是你在构造函数中有一些 运行 时间变化。就我而言,我显然不这样做,但是有什么方法可以以不涉及使用 null
作为默认参数的方式来解决这个问题?
我会使用方法重载:
public abstract class Action
{
public string Name { get; private set; }
public Action(string name) { Name = name; }
public bool PerformAction() => PerformAction(ActionArgs.Empty);
public abstract bool PerformAction(ActionArgs args);
}
我正在尝试构建一个 'Action' 摘要 class,它将以多种不同的方式使用。在我的例子中,一个动作只是一个简单的可重复任务,由各种 'Triggers' 调用。我还创建了一个 'ActionArgs' class 用作结构来保存要执行的操作的参数。默认 'ActionArgs' 对象不包含任何参数,旨在充当默认值。但是,我希望能够创建从它们各自的父级继承的 'Action's 和 'ActionArgs',但我总是希望基本的空 ActionArgs 对象充当可选参数的默认值,因为一些动作将有参数,其他的可能没有。我在实现这一目标时遇到了问题。我已经尝试了一些东西,但这就是我想要的:
public abstract class Action
{
public string Name { get; private set; }
public Action(string name) { Name = name; }
public abstract bool PerformAction(ActionArgs args = ActionArgs.Empty);
}
public class ActionArgs
{
public static readonly ActionArgs Empty = new ActionArgs();
public ActionArgs() { }
}
在尝试此操作时,我在 PerformAction() 定义中遇到错误,指出默认参数值必须是编译时常量。为什么这不可能在编译时解决?我猜这是因为它假设最坏的情况是你在构造函数中有一些 运行 时间变化。就我而言,我显然不这样做,但是有什么方法可以以不涉及使用 null
作为默认参数的方式来解决这个问题?
我会使用方法重载:
public abstract class Action
{
public string Name { get; private set; }
public Action(string name) { Name = name; }
public bool PerformAction() => PerformAction(ActionArgs.Empty);
public abstract bool PerformAction(ActionArgs args);
}