2

我有一些方法如下:

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();

但是,这会导致“不明确的调用”错误。

我能做些什么来避免这种情况?

4

2 回答 2

4

问题是返回类型不是C# 中方法签名的一部分。所以你必须以不同的方式命名这些方法。另外,不要在参数名称中使用下划线。

引用 MSDN 关于方法签名的工作原理:

方法的签名由方法的名称和每个形式参数的类型和种类(值、引用或输出)组成,按从左到右的顺序考虑。方法的签名特别不包括返回类型,也不包括可以为最右边的参数指定的 params 修饰符。

这是解决它的一种方法。当您返回类型的默认值时,您可以将其设为通用并使用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;
        }
    }
于 2011-08-25T18:53:39.330 回答
2

交换机架构。

 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);

更新:添加了约束 - 显然,使其通用的问题是您可以提供任何类型;但是,您的问题随后变成了使其符合将整数转换为T.

于 2011-08-25T18:54:00.320 回答