在C#中编写静态和非静态方法时,如何避免“call is ambiguous ...”错误?

时间:2009-10-12 19:36:11

标签: c# .net static thread-safety

我有许多代表业务事务调用的类:执行适当的存储过程。

现在看起来像这样:

public static class Request
{
    public static void Approve(..) {
        using(connection) {
            command.Text = "EXEC [Approve] ,,"]
            command.ExecuteNonQuery();
        }
    }
}

我想让它们更加线程安全:

public class Request {
    public static void Approve(..) {
        new Request().Approve(..);
    }

    internal void Approve(..) {
        using(connection) {
            command.Text = "EXEC [Approve] ,,"]
            command.ExecuteNonQuery();
        }
    }
}

但是收到下一条错误消息:

  

电话之间的暧昧不明确   以下方法或属性:   'MyNamespace.Request.Approve(..)'和   'MyNamespace.Request.Approve(..)'

我如何强制,标记我从静态调用非静态实例方法?

或者,如果不重命名其中一种方法,我不能这样做?或者将静态方法移动到另一个类等

2 个答案:

答案 0 :(得分:4)

C#允许不允许通过实例引用调用静态方法。因此 - 方法必须以不同方式命名或使用参数重载来区分静态方法和实例方法。

在您的示例中,由于Approve()方法是内部的,因此重命名它可能是最简单的选择。

关于标记方法是静态的......我(个人)认为这个名称是区分两者的完美方法 - 为什么要发明更复杂的东西。

答案 1 :(得分:3)

如果您是从某个实例(例如requestVar.Approve())拨打电话,那么不,您必须重命名。但是,可以使用Request.Approve()来调用静态。