2010-08-21 74 views
3

什么是错的:F#上溯造型的TextBlock到的UIElement

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

的错误是:类型 'System.ComponentModel.ISupportInitialize' 这里需要和不可用。您必须添加一个引用到组装“系统,版本= 4.0.0 ....”

TextBlockUIElement亚型......

注意,这样做的错误消息指出什么解决问题,但为什么有必要做一些像上传一样基本的事情?

+1

TextBlock继承自实现ISupportInitialize的FrameworkElement,所以我猜继承链中的所有类型都必须可用。 – 2010-08-21 15:05:33

+0

相关:http://stackoverflow.com/questions/738349/why-must-i-chain-reference-assemblies – 2010-08-21 15:08:37

回答

8

在他(现已删除?)答复中提到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 

在这种情况下,智能感知需要看的类型(以便它可以填充成员完成)。

+1

TextBlock本身不在System.dll中,而是*继承System.dll中的接口*。 – 2010-08-21 15:20:10

+0

@Mauricio:这就是我的意思,但我的描述不是很清楚 - 我添加了一个没有解释,这是因为界面。谢谢! – 2010-08-21 18:26:42

+0

谢谢。这就说得通了。 – Jules 2010-08-21 21:16:33

-3

documentation:。

“在许多面向对象的语言,向上转型是隐式的;在F#中,规则略有不同,当您将参数传递给在对象类型的方法上溯造型自动应用然而,对于模块中的let-bound函数,上传不是自动的,除非参数类型被声明为灵活类型。有关更多信息,请参见Flexible Types(F#)。

如果你使用的语法如下:

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

您的代码将使用灵活型(由#所示),它会编译。然而,现在你会得到一个警告:

“这个构造会导致代码的泛型低于它的类型注释所指示的类型变量所暗示的使用'#','_'或其他类型注释或者在'c:\ path \ Program.fs'附近被限制为键入'TextBlock'。“

+0

这回答了“为什么upcast?”的问题。不是“为什么需要参考?”这是OP要求的。 – 2010-08-21 15:09:19