Страницы

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

вторник, 31 марта 2020 г.

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

#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"); } }

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

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