如何避免使用包含可空类型的默认参数的重写方法的模糊引用

本文关键字:参数 默认 重写 方法 引用 模糊 类型 何避免 包含可 | 更新日期: 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的要求。