Перегрузка метода с типами C#

Запишите все ярлыки и функции, которые Вы используете в своем текущем редакторе при использовании его на работе. Затем сядьте в субботу утром, и Google использования и переполнение стека узнают, как сделать каждого из тех, которые в vi. Вероятно, лучше всего, если Вы используете лист (или листы) бумаги для этого.

Теперь отключают/удаляют других редакторов работы так, чтобы она взяла Вас дольше, чтобы найти и переустановить их, чем взгляд на Ваше сравнение покрывает и делает это в vi - т.е. у Вас нет выбора.

Наконец, опубликуйте свой список перекрестных ярлыков от Вашего старого редактора к Вашему новому на Вашем блоге.

Удачи!

11
задан Chris Moschini 25 June 2015 в 18:31
поделиться

7 ответов

То, что вы пытаетесь сделать, возможно следующим образом:

class TestClass<T>
{
   public string GetName<T>()
   {
      Type typeOfT = typeof(T);
      if(typeOfT == typeof(string))
      {
          //do string stuff
      }
   }
}

Хотя это возможно, вы в некотором роде побеждаете цель дженериков. Смысл дженериков в том, что тип не имеет значения , поэтому я не думаю, что дженерики подходят в этом случае.

12
ответ дан 3 December 2019 в 05:34
поделиться

Специализация в C # невозможна. Наиболее близким к C # является следующее

public void Example() {
  public static void Method<T>(T value) { ... }
  public static void Method(int value){ ... }
  public static void Method(string) { ... }
}

. Компилятор C # предпочтет неуниверсальный метод универсальному методу. Это означает, что вызов с параметром int будет привязан к перегрузке int по сравнению с общей.

Example.Method(42);  // Method(int)
Example.Method(new Class1())  // Method<T>(T)

Это вас укусит, потому что это не применимо, когда метод вызывается в общем случае. В этом случае он будет связываться с общей перегрузкой независимо от типа.

public void Gotcha<T>(T value) {
  Example.Method(value);
}

Gotcha(42);  // Still calls Example.Method<T>()
4
ответ дан 3 December 2019 в 05:34
поделиться

«Специализация» невозможна в C #, как в C ++. В дженериках .NET общий класс или метод должны быть одинаковыми для всех возможных значений T. Это позволяет среде выполнения выполнять оптимизацию двух разных ссылочных типов, скажем, TestClass и TestClass >, используйте тот же машинный код языка. (разные типы значений получают отдельный машинный код, но вы по-прежнему не можете специализироваться.)

Я считаю, что иногда помогает создать общий интерфейс или базовый класс, подобный этому:

abstract class Base<T> {
  public abstract T GetName();
  // any common code goes here that does not require specialization
}

И выполнить специализацию в производных классах:

class IntVersion : Base<int> {
  public override int GetName() { return 1; }
  public int GetName(int addNumber) { ... }
}
class StringVersion : Base<string> {
  public override string GetName() { return "foo"; }
}
class DateTimeVersion : Base<DateTime> {
  public override DateTime GetName() { return DateTime.Now; }
}
4
ответ дан 3 December 2019 в 05:34
поделиться

Нет, это невозможно. То, что вы пытаетесь сделать, похоже на специализацию шаблонов в C ++, что (к сожалению) невозможно в C #.

Вам нужно if / else или включить

typeof(T)

для вызова специализированных реализаций.

Однако вы можете ограничить тип T классом (ссылочное значение), структурой (значение) или подклассом определенного базового класса, например:

 public Foo<T> DoBar<T>() where T : FooBase;
1
ответ дан 3 December 2019 в 05:34
поделиться

C # не Нет поддержки для такой отправки.

, и это неправильный способ также выполнять перегрузку метода (Error'TestClass 'уже определяет член с именем' GetName 'с теми же типами параметров), если все внутри <> не является частью сигнатуры метода.

0
ответ дан 3 December 2019 в 05:34
поделиться

Подойдет ли вам использование методов расширения класса? ?

Вы можете добавлять методы к нужным классам, а затем вызывать их таким же образом.

namespace ExtensionMethods
{
    public static class MyExtensions
    {
        public static int GetName(this String str)
        {
            ...
        }
    }   
}

вызывается с использованием:

myString.GetName();
0
ответ дан 3 December 2019 в 05:34
поделиться

Если вам нужно выполнять в классе работу с конкретным типом, то ваш класс не является универсальным. Вероятно, вам следует создать отдельный класс для каждого типа, с которым вы хотите работать. Если есть какие-то функциональные возможности, у которых есть веские причины быть универсальными, вы можете поместить их в общий базовый класс.

Пример:

abstract class TestClass<T>
{
    public List<T> Items { get; set; }

    // other generic (i.e. non type-specific) code
}

class IntTestClass : TestClass<int>
{
    public string GetName()
    {
        // do work knowing that the type is an int
    }

    // other code specific to the int case
}

class StringTestClass : TestClass<string>
{
    public string GetName()
    {
        // do work knowing that the type is a string
    }

    // other code specific to the string case
}
0
ответ дан 3 December 2019 в 05:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: