Metodi statici e di istanza con lo stesso nome?

Ho una class con un’interfaccia statica e una non statica in C #. È ansible avere un metodo statico e un metodo non statico in una class con lo stesso nome e firma?

Ricevo un errore del compilatore quando provo a farlo, ma per qualche motivo ho pensato che c’era un modo per farlo. Ho sbagliato o non c’è modo di avere metodi sia statici che non statici nella stessa class?

Se questo non è ansible, c’è un buon modo per implementare qualcosa di simile che possa essere applicato genericamente a qualsiasi situazione?

MODIFICARE
Dalle risposte che ho ricevuto, è chiaro che non c’è modo di farlo. Vado con un sistema di denominazione diverso per ovviare a questo problema.

No, non puoi. Il motivo della limitazione è che i metodi statici possono anche essere chiamati da contesti non statici senza dover anteporre il nome della class (quindi MyStaticMethod () anziché MyClass.MyStaticMethod ()). Il compilatore non può dire quale stai cercando se ne hai entrambi.

È ansible avere metodi statici e non statici con lo stesso nome, ma diversi parametri che seguono le stesse regole dell’overload del metodo, semplicemente non possono avere esattamente la stessa firma.

In realtà, c’è un modo per ottenere ciò implementando esplicitamente un’interfaccia. Non è una soluzione perfetta ma può funzionare in alcuni casi.

interface IFoo { void Bar(); } class Foo : IFoo { static void Bar() { } void IFoo.Bar() { Bar(); } } 

A volte mi imbatto in questa situazione quando creo le classi wrapper per le chiamate P / Invoke.

È ansible richiamare metodi statici dai metodi di istanza senza dover specificare il nome del tipo:

 class Foo { static void Bar() { } void Fizz() { Bar(); } } 

… quindi è logico che non ti sia permesso di avere un metodo statico e un metodo di istanza con la stessa firma.

Cosa stai cercando di realizzare? È difficile suggerire una soluzione alternativa senza conoscere le specifiche. Vorrei solo rinominare uno dei metodi.

C # non è ben progettato quando si tratta di questo …

Se è vero che potresti volere il globale o il non globale, dovrebbe sceglierne uno per impostazione predefinita, e se vuoi l’altro, puoi semplicemente qualificarlo di più.

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

È ansible avere il metodo statico e di istanza con lo stesso nome, purché la loro dichiarazione sia diversa nel numero o nel tipo di parametri. È la stessa regola su come puoi avere due metodi di istanza con lo stesso nome in una class.

Sebbene tecnicamente, nel caso del metodo statico rispetto all’istanza, differiscano già dalla presenza di questo parametro implicito nel metodo di istanza, tale differenza non è sufficiente per il compilatore per determinare quale dei due si desidera chiamare.

Aggiornamento : ho fatto un errore. I valori di ritorno non sono sufficienti per avere una firma diversa.

OK. La radice di questo problema è che C # non consente di chiamare un metodo statico da un metodo di istanza senza specificare il nome del tipo.

Altri linguaggi OO completi (come Smalltalk) non consentono questo e anche la sua giusta confusione alle persone che comprendono gli oggetti. La separazione tra lato istanza e lato class (o statico) è molto importante e avere un linguaggio che promuova la confusione in quei dettagli è …….. non è una buona idea …. ma tipico del tipo di cose che ci aspettiamo dalla MS.

Adrian