在具有单个构造函数的C#类中,我可以添加类摘要XML文档和构造函数XML文档:
///<summary>
///This class will solve all your problems
///</summary>
public class Awesome
{
/// <summary>
/// Initializes a new instance of the <see cref="Awesome"/> class.
/// </summary>
/// <param name="sauce">The secret sauce.</param>
public Awesome(string sauce)
{
//...implementation elided for security purposes
}
}
Run Code Online (Sandbox Code Playgroud)
如何使用等效的F#类进行相同的操作,以使生成的文档相同?
type Awesome(sauce: string) =
//...implementation elided for security purposes
Run Code Online (Sandbox Code Playgroud)
澄清:我知道标准的XML文档标签可以在F#中使用.我的问题是如何将它们添加到上面的代码片段,以便记录类型和构造函数.
我今天在F#模式匹配语法中遇到了一个奇怪的问题,这可能导致穷举检查中的明显失败.
type Thing =
| This
| That
| Other
let useThing =
function
| This -> "A"
| That -> "A"
| That -> "B" // compiler complains
| Other -> "B"
Run Code Online (Sandbox Code Playgroud)
在上面的场景中,编译器有用地告诉我第二条规则永远不会匹配.但是,如果我试图使代码更紧凑并且已经编写了
let useThing =
function
| This | That -> "A"
| That | Other -> "B"
Run Code Online (Sandbox Code Playgroud)
我没有得到编译器的任何帮助.我认为原因是它| This | That ->. "A"不是一个快捷方式| This -> "A" | That -> "A",即使它看起来非常像(并且我已经看到许多代码样本将其视为这样).相反,根据我的发现,管道符号既可用于分隔单个模式,也可用作OR模式.
对于大多数DU而言,这不是一个大问题,但是在将具有大量案例的DU映射到具有少量案例的另一个DU时遇到了问题.我尝试使用快捷语法导致了一个错误.
所以我的问题是:
我有一个.NET程序集,我通过tlb文件向COM公开,以及一个注册tlb的安装程序.我已手动检查安装程序是否正常工作,并且COM客户端可以访问该库.到现在为止还挺好...
但是,我正在尝试组合一些自动系统测试,检查安装程序是否正常工作.作为其中的一部分,我已经在VM上自动安装,我现在想要对已安装的COM库进行一些调用以验证它是否正常工作.我最初想过在VB6中编写一些测试,但我已经有了一大堆用C#编写的测试,它引用了.NET程序集.我希望我可以更改这些以引用.tlb,但是当我在VS2008中尝试这个时出现错误:
ActiveX类型库'blah.tlb'是从.NET程序集导出的,无法添加为引用.
有什么方法可以欺骗VS2008允许我添加这个引用,也许是通过编辑tlb文件?
谷歌搜索没有提出任何解决方案.我发现的只是一篇Microsoft Connect文章,声明这是"按设计":http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx ?FeedbackID = 120882
这是一个简单的C#结构,它对ctor参数进行了一些验证:
public struct Foo
{
public string Name { get; private set; }
public Foo(string name)
: this()
{
Contract.Requires<ArgumentException>(name.StartsWith("A"));
Name = name;
}
}
Run Code Online (Sandbox Code Playgroud)
我已成功将其翻译成F#类:
type Foo(name : string) =
do
Contract.Requires<ArgumentException> (name.StartsWith "A")
member x.Name = name
Run Code Online (Sandbox Code Playgroud)
但是,我无法将其转换为F#中的结构:
[<Struct>]
type Foo =
val Name : string
new(name : string) = { do Contract.Requires<ArgumentException> (name.StartsWith "A"); Name = name }
Run Code Online (Sandbox Code Playgroud)
这给出了编译错误:
无效的记录,序列或计算表达式.序列表达式应为'seq {...}'形式
这不是有效的对象构造表达式.显式对象构造函数必须调用备用构造函数或初始化对象的所有字段,并指定对超类构造函数的调用.
我哪里做错了?
在大多数情况下,我理解命令与CQRS + ES系统中的事件之间的区别.但是,有一种情况我无法弄清楚.
假设我正在构建个人财务跟踪系统,用户可以在其中输入借方/贷方.显然这些是命令,一旦验证它们,域模型就会更新并发布一个事件.但是,假设信用/借记信息也直接来自外部系统,例如,用户的花店发送一条消息,表明他已经向用户的信用卡收取了定期交付的母亲节.在这种情况下,消息似乎是一个事件(已经发生了收费),但消息可能格式错误并且将被拒绝.它真的是一个命令吗?但是后来需要一种发送ACK/NACK的方法,这不是这里的情况(花店只有在知道借记已经发生时才发送消息).
编辑:只是为了澄清,我不是在谈论外部系统对我的事件和/或命令的了解.我有一个组件从外部系统接收数据,然后必须发布事件或发送命令.问题是,我的组件应该使用哪个事件或命令?
有人可以解释这个F#的好奇心吗?
type IFoo =
abstract member Bar1: int * int -> int * int
abstract member Bar2: int * int -> (int * int)
abstract member Bar3: (int * int) -> int * int
type Foo() = class end
with
interface IFoo with
member this.Bar1 (x, y) = (x, y)
member this.Bar2 (x, y) = (x, y) // Same impl as Bar1 i.e. parentheses on RHS of -> in interface member definition are ignored
// member this.Bar3 (x, y) = …Run Code Online (Sandbox Code Playgroud) 我认为F#函数和System.Func之间的转换必须手动完成,但似乎有一种情况,编译器(有时)会为你做.当出错时,错误信息不准确:
module Foo =
let dict = new System.Collections.Generic.Dictionary<string, System.Func<obj,obj>>()
let f (x:obj) = x
do
// Question 1: why does this compile without explicit type conversion?
dict.["foo"] <- fun (x:obj) -> x
// Question 2: given that the above line compiles, why does this fail?
dict.["bar"] <- f
Run Code Online (Sandbox Code Playgroud)
最后一行无法编译,错误是:
This expression was expected to have type
System.Func<obj,obj>
but here has type
'a -> obj
Run Code Online (Sandbox Code Playgroud)
显然,该功能f没有签名'a > obj.如果F#3.1编译器对第一个字典赋值感到满意,那为什么不是第二个呢?
我有一个.NET函数,可以进行一些复杂的计算.根据传入的参数,函数:
可以从函数参数化准确地预测要写入磁盘的数据量.没有简单的方法来预测函数参数化的其他资源需求.
我需要通过Web服务公开此功能.这项服务需要:
我打算通过让初始请求返回可以轮询进度的状态资源来处理长期运行的性质.计算完成后,此资源将提供输出数据的位置,客户端可以下载该位置(可能通过FTP).
我不清楚如何最好地处理其他要求.我正在考虑某种"计算池",它维护计算器的实例并跟踪当前正在使用的计算器,但我还没有弄清楚细节.
有类似情况经验的人有什么建议吗?只要解决方案可以在Windows机器上运行,就可以考虑所有技术选项.
f# ×6
c# ×2
.net ×1
c#-to-f# ×1
com ×1
com-interop ×1
cqrs ×1
interop ×1
struct ×1
web-services ×1