如何避免使用包含可空类型的默认参数的重写方法的模糊引用
本文关键字:参数 默认 重写 方法 引用 模糊 类型 何避免 包含可 | 更新日期: 2023-09-27 18:06:44
我有以下一些方法:
static public int GetInt(int _default = 0)
{
// do work, return _default if error
}
static public int? GetInt(int? _default = null)
{
// do work, return _default if error
}
我希望当使用这些方法作为重写时,该方法也将根据我使用它们分配给的变量来选择:
int value1 = GetInt();
int? value2 = GetInt();
但是这会导致"Ambiguous Invocation"错误。
我能做些什么来避免这种情况?
问题是返回类型不是c#中方法签名的一部分。所以你必须用不同的方法命名。另外,不要在参数名中使用下划线。
引用MSDN关于方法签名如何工作:
方法的签名由方法名和每种形式的类型和种类(值、引用或输出)参数,按从左到右的顺序考虑。一个人的签名方法不包含返回类型,也不包含包括可以为最右边指定的参数修饰符参数。
这是解决它的一种方法。当您返回默认类型时,您可以将其设置为泛型并使用default(T)
。
static void Main(string[] args)
{
int value1 = GetInt<int>();
int? value2 = GetInt<int?>();
}
static public T GetInt<T>(T defaultValue = default(T))
{
bool error = true;
if (error)
{
return defaultValue;
}
else
{
//yadayada
return something else;
}
}
交换机架构。
static public T GetInt<T>(T defaultValue = default(T))
where T: struct
{
// Do Work.
// On failure
return defaultValue;
}
然后,当你调用这个函数时,你应该受益于泛型类型:
int value1 = GetInt(0);
int? value2 = GetInt(default(int?));
或者如果你想省略默认值:
int value1 = GetInt<int>();
int? value2 = GetInt<int?>();
或者,如果您只想要默认值,您可以简单地返回
return default(T);
UPDATE:添加约束-显然,使其泛型的问题是,然后你可以提供任何类型;然而,您的问题就变成了使其符合将整数转换为T
的要求。