Я проводил некоторые испытания и натолкнулся на что-то странное. Скажем, у меня есть этот интерфейсВозвращает ли ключевое слово `as` все члены класса?
interface IRobot
{
int Fuel { get; }
}
Как вы можете видеть, это только для чтения. Итак, теперь я собираюсь сделать класс, который его реализует
class FighterBot : IRobot
{
public int Fuel { get; set; }
}
Теперь вы можете прочитать его и установить. Так давайте сделаем несколько тестов:
FighterBot fighterBot;
IRobot robot;
IRobot robot2;
int Fuel;
public Form1()
{
InitializeComponent();
fighterBot = new FighterBot();
robot = new FighterBot();
}
Сначала я сделал это:
Fuel = fighterBot.Fuel;// Can get it
fighterBot.Fuel = 10; //Can set it
Это следовало ожидать, то я сделал это:
Fuel = robot.Fuel; //Can get it
robot.Fuel = 10; //Doesn't work, is read only
Также следует ожидать. Но когда я это делаю:
robot2 = robot as FighterBot;
Fuel = robot2.Fuel; //Can get it
robot2.Fuel = 10;//Doesn't work, is read only
Почему это не работает? Разве это не относится к роботу2 как к FighterBot? Поэтому не следует ли ему устанавливать топливо?
Топливо Иробота действительно только для чтения, это правильно! – David
Это будет работать, если вы скажете «var robot3 = robot как FighterBot;». Компилятор C# использует объявленный тип переменной, чтобы определить, какие функции доступны; присвоение нового значения robot2 не изменяет первоначальный объявленный тип (который по-прежнему остается IRobot). –