F # upcasting TextBlock в UIElement - PullRequest
       11

F # upcasting TextBlock в UIElement

3 голосов
/ 21 августа 2010

Что не так с:

let (x:UIElement) = upcast new TextBlock()

Ошибка: тип 'System.ComponentModel.ISupportInitialize' требуется здесь и недоступен.Вы должны добавить ссылку на сборку 'System, Version = 4.0.0 ....'

TextBlock - это подтип UIElement ...

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

Ответы [ 2 ]

8 голосов
/ 21 августа 2010

Поскольку lasseespeholt упоминается в его (теперь удаленном?) Ответе, в вашем коде нет ничего плохого, и вам просто нужно добавить ссылку на System.dll, как предполагает сообщение об ошибке.

Но что происходит? Вы получаете сообщение об ошибке в этой конкретной строке, потому что это первое место, где компилятор встречает некоторый тип из библиотеки System.dll (интерфейс ISupportInitialize, который реализуется TextBlock) и понимает, что ему нужен ссылка на библиотеку, чтобы понять тип.

Другой способ получить то же сообщение об ошибке - написать:

let x = new TextBlock() 
x.  // If you get IntelliSense here, you'll see just '<Note>' 
    // with the same error message as the one you're getting

В этом случае IntelliSense необходимо просмотреть тип (чтобы он мог заполнить завершение элемента).

0 голосов
/ 21 августа 2010

Из документации :

"Во многих объектно-ориентированных языках неявное обновление неявно; в F # правила немного отличаются. Принятие аргументов автоматически применяется при передаче аргументов в методыдля типа объекта. Однако для функций с привязкой в ​​модуле преобразование не происходит автоматически, если только тип параметра не объявлен как гибкий тип. Для получения дополнительной информации см. Гибкие типы (F #). "

Если вы используете следующий синтаксис:

let (x:#UIElement) = new TextBlock()

, ваш код будет использовать гибкий тип (обозначенный #), и он будет компилироваться.Однако теперь вы получите предупреждение:

"Эта конструкция приводит к тому, что код становится менее универсальным, чем указано в его аннотациях типов. Переменная типа, подразумеваемая использованием '#', '_' или другого типааннотация в или около 'c: \ path \ Program.fs' ограничена типом 'TextBlock'. "

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