Метод расширения по типу и nullable <type>

Для простоты предположим, что я хочу написать метод расширения для типа 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;
    }
}

Можно ли это сделать, используя только один метод?

Ответ 1

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

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;
    }
}

Ответ 2

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

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

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