Я был удивлен, увидев сегодня, что это возможно, но я беспокоюсь, что это должно обсуждаться раньше.Почему C# дразнят со структурной типизацией, когда он абсолютно знает, что у нее ее нет?
public interface ICanAdd
{
int Add(int x, int y);
}
// Note that MyAdder does NOT implement ICanAdd,
// but it does define an Add method like the one in ICanAdd:
public class MyAdder
{
public int Add(int x, int y)
{
return x + y;
}
}
public class Program
{
void Main()
{
var myAdder = new MyAdder();
var iCanAdd = (ICanAdd)myAdder; //compiles, but for what sake?
int sum = iCanAdd.Add(2, 2); //na, not game for it, cast had already failed
}
}
Компилятор (правильно?) Скажет мне, что в приведенной выше ситуации существует явное литье. Я был взволнован, чувствуя структурную типизацию там, но времени на запуск не удается. Итак, когда C# всегда помогает? Любые сценарии такого кастинга будут работать? Как бы то ни было, я уверен, что компилятор заранее знает, myAdder
не ICanAdd
, ну технически.
Почему нисходящий? Есть ли у меня еще один сеанс мозгового пердеть? – nawfal
Хороший вопрос! Где «сумматор» в 'adder.Add' определен? Вы имели в виду 'iCanAdd'? – dasblinkenlight
@ dasblinkenlight да конечно. Я отредактирую опечатку :) Но в любом случае эта строка не попадает. – nawfal