метод расширения на тип и обнуляемый <type> - PullRequest
11 голосов
/ 13 апреля 2009

Ради простоты, давайте предположим, что я хочу написать метод расширения для типа int? и int:

public static class IntExtentions
{
    public static int AddOne(this int? number)
    {
        var dummy = 0;
        if (number != null)
            dummy = (int)number;

        return dummy.AddOne();
    }

    public static int AddOne(this int number)
    {
        return number + 1;
    }
}

Можно ли это сделать только одним методом?

Ответы [ 2 ]

17 голосов
/ 13 апреля 2009

К сожалению нет. Вы можете сделать Int? (или какой бы тип обнуляемого объекта вы не использовали) метод очень легко вызывает метод, не обнуляемый, поэтому вам не нужно дублировать какую-либо логику с двумя методами - например,

public static class IntExtensions
{
    public static int AddOne(this int? number)
    {
        return (number ?? 0).AddOne();
    }

    public static int AddOne(this int number)
    {
        return number + 1;
    }
}
9 голосов
/ 13 апреля 2009

Нет, вы не можете. Это можно проверить экспериментально, скомпилировав следующий код

public static class Example {
  public static int Test(this int? source) {
    return 42;
  }
  public void Main() {
    int v1 = 42;
    v1.Test();  // Does not compile
  }
}

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

...