Как разрешить двусмысленность, когда аргумент равен нулю?

Компиляция следующего кода вернет ошибку The call is ambiguous between the following methods or properties. Как разрешить его, поскольку я не могу явно преобразовать null в любой из этих классов?

static void Main(string[] args)
{
    Func(null);
}

void Func(Class1 a)
{

}

void Func(Class2 b)
{

}

Ответы

Ответ 1

Func((Class1)null);

Ответ 2

Вставьте null в тип:

Func((Class1)null);

Ответ 3

Вы также можете использовать переменную:

Class1 x = null;
Func(x);

Ответ 4

Использование as для кастинга делает его более читаемым с той же функциональностью.

Func(null as Class1);

Ответ 5

Методы Func() принимают ссылочный тип как параметр, который может быть нулевым. Поскольку вы вызываете метод с явным значением null, компилятор не знает, должен ли ваш null ссылаться на объект Class1 или объект Class2.

У вас есть два варианта:

Передайте значение null в тип Class1 или Class2, как в Func((Class1)null) или Func((Class2)null)

Предоставить новую перегрузку метода Func(), который не принимает никаких параметров, и вызвать эту перегрузку, если у вас нет явной ссылки на объект:

void Func()
{
    // call this when no object is available
}

Ответ 6

Вы должны иметь возможность передавать значение null в любое из этих значений, так же как и переменная Func((Class1)null).