Страницы

Поиск по вопросам

суббота, 8 июня 2019 г.

Разные перегрузки универсального метода в зависимости от указанного типа

товарищи! Наткнулся я тут на старенькое интеревью с Джоном Скитом на хабре. В его рамках Джон задал читателям следующий вопрос:
Как вы можете заставить этот код скомпилироваться, так чтобы он вызвал три различные перегрузки метода?
void Foo() { EvilMethod(); EvilMethod(); EvilMethod(); }
Мне не совсем понятно, как можно реализовать такую вещь, ведь даже если использовать where, то мы получаем ошибку, что метод с таким же названием и параметрами уже существует. На SO искал, в Google тоже (возможно, искал плохо, так что если что - палками не бейте)) Будет очень интересно выслушать ваши идеи, так что заранее спасибо)


Ответ

Удалось сделать только так:
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"); } }

Комментариев нет:

Отправить комментарий