Почему эта перегрузка C # с обнуляемыми значениями не является неоднозначной? - PullRequest
0 голосов
/ 04 мая 2018

Почему C # допускает перегрузку следующего метода:

void F(int a) { Console.WriteLine(1); }
void F(int? a) { Console.WriteLine(2); }

Если я запускаю этот код:

A a = new A();
a.F(1); 

печатает 1. Как компилятор знает, какой из них вызывать. Разве это не двусмысленно?

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

У меня есть работающий пример здесь .

Обновление: После прочтения ответа мое замешательство возникло из-за того, что я думал, что обнуляемые параметры - это синоним необязательных параметров.

Действительно, замена второго метода на void F(int a = 0); приводит к ошибке компиляции.

1 Ответ

0 голосов
/ 04 мая 2018

int? на самом деле является Nullable<int> структурой, которая различает их.

Следующий вызов должен вывести 2

int? a = 0;
F(a);

По поводу следующего звонка ...

A a = new A();
a.F(1);

Литерал 1 является int, а не int?, поэтому он идет к методу void F(int a). Если вы передадите null методу, это не может быть int, поэтому он переходит к методу void F(int? a), так как это тип данных, который может быть нулевым.

Оба метода могут принимать значение 1, но компилятор выберет наиболее специфическую перегрузку, которая в данном случае принимает тот же тип, int.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...