#c_sharp #generics #методы
товарищи! Наткнулся я тут на старенькое интеревью с Джоном Скитом на хабре. В его рамках Джон задал читателям следующий вопрос: Как вы можете заставить этот код скомпилироваться, так чтобы он вызвал три различные перегрузки метода? void Foo() { EvilMethod(); EvilMethod (); EvilMethod (); } Мне не совсем понятно, как можно реализовать такую вещь, ведь даже если использовать where, то мы получаем ошибку, что метод с таким же названием и параметрами уже существует. На SO искал, в Google тоже (возможно, искал плохо, так что если что - палками не бейте)) Будет очень интересно выслушать ваши идеи, так что заранее спасибо)
Ответы
Ответ 1
Удалось сделать только так: public interface IEvilMethod{ void EvilMethod (); } public class Example : IEvilMethod , IEvilMethod , IEvilMethod { public void Foo() { ((IEvilMethod ) this).EvilMethod (); ((IEvilMethod ) this).EvilMethod (); ((IEvilMethod ) this).EvilMethod (); } void IEvilMethod .EvilMethod () { Console.WriteLine(typeof(T)); } void IEvilMethod .EvilMethod () { Console.WriteLine(typeof(T)); } void IEvilMethod .EvilMethod () { Console.WriteLine(typeof(T)); } } Update Нашел решение здесь. public class ReferenceGeneric where T : class { } public class EvilClassBase { protected void EvilMethod () { Console.WriteLine("int?"); } } public class EvilClass : EvilClassBase { public void Run() { EvilMethod (); EvilMethod (); EvilMethod (); } private void EvilMethod (ReferenceGeneric arg = null) where T : class { Console.WriteLine("string"); } private void EvilMethod (T? arg = null) where T : struct { Console.WriteLine("int"); } }
Комментариев нет:
Отправить комментарий