#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"); } }
Комментариев нет:
Отправить комментарий