【发布时间】:2014-06-21 05:49:38
【问题描述】:
请注意:此问题不与this问题相同。
我最近遇到了一些我以前没有遇到过的 C# 语法:
有没有办法在 F# 中做到这一点?
class Two
{
public string Test { get; set; }
}
class One
{
public One()
{
TwoProperty = new Two();
}
public Two TwoProperty { get; private set; }
}
var test = new One(){ TwoProperty = { Test = "Test String" }};
(注意当 setter 为私有时,初始化器中 TwoProperty 的初始化 - 它正在为存储在 TwoProperty 中的对象设置属性,但 不 存储 @987654325 的新实例@在属性中)
编辑: 我最近在 monotouch 的构造函数中遇到了一些 C# 代码,如下所示:
nameLabel = new UILabel {
TextColor = UIColor.White,
Layer = {
ShadowRadius = 3,
ShadowColor = UIColor.Black.CGColor,
ShadowOffset = new System.Drawing.SizeF(0,1f),
ShadowOpacity = .5f
}
};
我能想到的最好的 F# 翻译是这样的:
let nameLabel = new UILabel ( TextColor = UIColor.White )
do let layer = nameLabel.Layer
layer.ShadowRadius <- 3.0f
layer.ShadowColor <- UIColor.Black.CGColor
layer.ShadowOffset <- new System.Drawing.SizeF(0.0f,1.0f)
layer.ShadowOpacity <- 0.5f
这并不可怕,但由于重复的 layer 引用加上它的命令性更强且声明性更少,确实会产生更多噪音。
【问题讨论】:
-
向我们展示您迄今为止的尝试。你觉得有什么困难?
-
这是 C# 的文档化功能吗?允许在这种情况下调用私有 setter 似乎是一个错误。
-
@Daniel 它没有调用私人二传手。它在设置器中包含的对象上设置属性。请参阅 F# 翻译以了解 C# 正在做什么。
-
我明白了。抱歉,我看得太快了。我认为这在 F# 中是不可能的。
标签: c# f# c#-to-f# object-initializers