.net 静态方法和示例方法是否同名?

dbf7pr2w  于 2023-11-20  发布在  .NET
关注(0)|答案(7)|浏览(234)

我有一个C#的类,它同时有一个静态和一个非静态接口。是否可以在一个类中有一个静态和一个非静态方法,并且具有相同的名称和签名?
当我尝试这样做的时候,我得到了一个编译器错误,但是出于某种原因,我认为有一种方法可以做到这一点。是我错了还是没有办法在同一个类中同时拥有静态和非静态方法?
如果这是不可能的,有没有一个好的方法来实现这样的东西,可以普遍适用于任何情况?

编辑

从我收到的回复来看,很明显没有办法做到这一点。我将使用一个不同的命名系统来解决这个问题。

dy1byipe

dy1byipe1#

不,你不能。限制的原因是静态方法也可以从非静态上下文中调用,而不需要在类名之前添加(所以是MyStaticMethod()而不是MyClass.MyStaticMethod())。如果你有两个方法,编译器无法分辨你在找哪个方法。
你可以有静态和非静态方法,它们的名字相同,但是不同的参数遵循与方法重载相同的规则,只是它们不能有完全相同的签名。

g52tjvyc

g52tjvyc2#

实际上,有一种方法可以通过显式实现接口来实现这一点。这不是一个完美的解决方案,但在某些情况下可以工作。

  1. interface IFoo
  2. {
  3. void Bar();
  4. }
  5. class Foo : IFoo
  6. {
  7. static void Bar()
  8. {
  9. }
  10. void IFoo.Bar()
  11. {
  12. Bar();
  13. }
  14. }

字符串
当我为P/Pockerke调用创建 Package 器类时,我有时会遇到这种情况。

展开查看全部
ijxebb2r

ijxebb2r3#

您可以从示例方法调用静态方法,而无需指定类型名称:

  1. class Foo
  2. {
  3. static void Bar()
  4. {
  5. }
  6. void Fizz()
  7. {
  8. Bar();
  9. }
  10. }

字符串
.所以不允许静态方法和示例方法具有相同的签名是有道理的。
你想达到什么目的?在不知道细节的情况下很难提出解决方案。我只会重命名其中一个方法。

展开查看全部
pjngdqdw

pjngdqdw4#

C#在这方面设计得不好。
虽然你可能想要全局或非全局,但默认情况下它应该选择一个,如果你想要另一个,那么你只需更多地限定它。

  1. class Logger {
  2. public static Logger instance;
  3. public static void Log(string message) {
  4. instance.Log(message); // currently the compiler thinks this is ambiguous, but really its not at all. Clearly we want the non-static method
  5. }
  6. public void Log(string message) {
  7. }
  8. public void DoStuff() {
  9. Log("doing instance stuff"); // this could be ambiguous, but in my opinion it should default to a call to this.Log()
  10. Logger.Log("doing global stuff"); // if you want the global qualify it explicitly
  11. }
  12. }

字符串

展开查看全部
sdnqo3pr

sdnqo3pr5#

你可以让静态方法和示例方法具有相同的名称,只要它们的声明在参数的数量或类型上不同。这与你如何在一个类中拥有两个同名的示例方法是一样的。
虽然从技术上讲,在静态方法和示例方法的情况下,它们已经在示例方法中隐式this参数的存在方面有所不同,但这种差异不足以让编译器确定您想要调用两者中的哪一个。

更新:我弄错了,返回值不足以有不同的签名。

roqulrg3

roqulrg36#

您可以添加可选参数

  1. public class Logger
  2. {
  3. public static Logger logger = new Logger();
  4. public void Log(string? message)
  5. {
  6. Console.WriteLine(message);
  7. }
  8. public void LogStatic(string? message)
  9. {
  10. Log(message, null);
  11. }
  12. public static void Log(string? message, object? _ = null)
  13. {
  14. logger.Log(message);
  15. }
  16. }

字符串

  1. static void Main(string[] args)
  2. {
  3. Logger.logger.Log("...");
  4. Logger.logger.LogStatic("...");
  5. Logger.Log("...");
  6. }

展开查看全部
z18hc3ub

z18hc3ub7#

可以使用扩展方法:

  1. public class Foo
  2. {
  3. public static void DoSomething(int parameter)
  4. {
  5. Console.WriteLine(parameter.ToString());
  6. }
  7. }
  8. public static class FooExtensions
  9. {
  10. public static void DoSomething(this Foo foo, int parameter)
  11. {
  12. Foo.DoSomething(parameter);
  13. }
  14. }

字符串
如果它们没有使用包含扩展方法的名称空间,那么它就不起作用,但扩展方法总是如此,所以它并不完美。

展开查看全部

相关问题