csharp项目中方法之间的歧义

时间:2014-08-08 06:06:26

标签: c#

这是主要课程:

public class ReportsParameter
{
    public ReportsParameter(string p, decimal? nullable);
    public ReportsParameter(string ParameterName, string Value);

    public string parameterName { get; set; }
    public string value { get; set; }
}

在我使用的另一个课程中:

reportsParameters1.Add(new ReportsParameter("Title", txtTitle.Text));
reportsParameters.Add(new ReportsParameter("IsCurrency", null));
reportsParameters.Add(new ReportsParameter("IsInactive", null));

当我构建项目时,我收到以下错误:

  

以下方法或属性之间的调用不明确:   'General.ReportsParameter.ReportsParameter(string,string)'和   'General.ReportsParameter.ReportsParameter(string,decimal?)'

包含IsCurrencyIsInactive的两行发生错误。

我可以使用DBNULL.Value.Tostring()吗?或者null与dbnull不同?

2 个答案:

答案 0 :(得分:7)

这是因为有一个可以为空的decimal?string也是可以为空的。

尝试这样做..以指示编译器调用适当的重载。

reportsParameters.Add(new ReportsParameter("IsCurrency", (string)null));

OR

reportsParameters.Add(new ReportsParameter("IsInactive", (decimal?)null));

酌情

答案 1 :(得分:0)

要添加到@ bit的答案,您可以将ReportsParameter类设为通用,具体取决于您之后使用它的方式。您可以获得不会丢失原始参数类型的好处,这意味着您可以获得更强的类型安全性。如果未指定null参数,您还可以为value参数提供默认public class ReportsParameter<T> { public ReportsParameter(string name, T value = default(T)) { _name = name; _value = value; } private readonly string _name; public string Name { get { return _name; } } private readonly T _value; public T Value { get { return _value; } } } 值:

// no need to pass the second parameter if it's null
list.Add(new ReportsParameter<string>("IsCurrency"));
list.Add(new ReportsParameter<double?>("IsInactive"));

然后在实例化时传递泛型参数:

public static class Reports
{
    public ReportsParameter<T> CreateParameter<T>
        (string name, T value = default(T))
    {
        return new ReportsParameter<T>(name, value);
    }
}

一个缺点是,要从编译器获取类型推断,您还需要一个工厂方法,如:

// no need to specify <string> in this case
reportsParameters1.Add(Reports.CreateParameter("Title", txtTitle.Text));

// but you need to do it here to resolve ambiguity
// (no need to pass the default value, however)
reportsParameters.Add(Reports.CreateParameter<string>("IsCurrency"));
reportsParameters.Add(Reports.CreateParameter<decimal?>("IsInactive"));

允许您在推断出类型时跳过显式泛型参数:

{{1}}