在重载

时间:2017-09-08 12:27:29

标签: c# overloading

案例是我有以下课程,例如:

public class SendFile
{
     public SendFile(Uri uri) { /* some code here */ }
     public SendFile(string id) { /* some code here */ }
}

然后,我们知道如果我想解析构造函数,我不能这样做:

// some string defined which are called "address" and "id"
var sendFile = new SendFile(String.IsNullOrEmpty(address) ? id : new Uri(address));

我的问题是如何以干净的方式解决此问题,而不创建" if"代码中的分支?喜欢以下内容:

SendFile sendFile;
if(String.IsNullOrEmpty(address))
{
     sendFile = new SendFile(id);
}
else
{
     sendFile = new SendFile(new Uri(address));
}

2 个答案:

答案 0 :(得分:6)

在上面的版本中,您会收到编译错误:

  

无法确定条件表达式的类型,因为'string'和'System.Uri'之间没有隐式转换

阅读MSDN documentation时,请说明:

  

first_expression和second_expression的类型必须相同,或者从一种类型到另一种类型必须存在隐式转换。


由于stringUri彼此之间没有隐式转换(您也不想要,因为您为什么会有两个不同的构造函数...), 要使用条件运算符,您应该采用不同的方式:

var sendFile = String.IsNullOrEmpty(address) ? new SendFile(id) : 
                                               new SendFile(new Uri(address));

答案 1 :(得分:0)

一种选择可能是将static'工厂'方法添加到SendFile并在那里处理:

public class SendFile
{
    public SendFile(Uri uri) { /* some code here */ }
    public SendFile(string id) { /* some code here */ }

    public static SendFile Create(string url, string fallbackId = null)
    {
        return string.IsNullOrEmpty(url)
            ? new SendFile(fallbackId)
            : new SendFile(new Uri(url));
    }
}

参数命名应明确指出fallbackId仅在未提供url的情况下使用。