gpt4 book ai didi

c# - F# 结构构造函数中的参数验证

转载 作者:可可西里 更新时间:2023-11-01 08:38:48 25 4
gpt4 key购买 nike

这是一个简单的 C# 结构,它对 ctor 参数进行一些验证:

public struct Foo
{
public string Name { get; private set; }

public Foo(string name)
: this()
{
Contract.Requires<ArgumentException>(name.StartsWith("A"));
Name = name;
}
}

我已经设法将其转换为 F# 类:

type Foo(name : string) = 
do
Contract.Requires<ArgumentException> (name.StartsWith "A")
member x.Name = name

但是,我无法将其转换为 F# 中的结构:

[<Struct>]
type Foo =
val Name : string
new(name : string) = { do Contract.Requires<ArgumentException> (name.StartsWith "A"); Name = name }

这会产生编译错误:

Invalid record, sequence or computation expression. Sequence expressions should be of the form 'seq { ... }'

This is not a valid object construction expression. Explicit object constructors must either call an alternate constructor or initialize all fields of the object and specify a call to a super class constructor.

我看过thisthis但它们不包括参数验证。

我哪里做错了?

最佳答案

您可以在初始化结构后使用 then block 。它在您的第一个 link 中针对类(class)进行了描述在 Executing Side Effects in Constructors 部分中,但它也适用于结构。

[<Struct>]
type Foo =
val Name : string
new(name : string) = { Name = name }
then if name.StartsWith("A") then failwith "Haiz"

更新:

另一种更接近您的示例的方法是使用 ; (顺序组合)和括号来组合表达式:

[<Struct>]
type Foo =
val Name : string
new(name : string) =
{ Name = ((if name.StartsWith("A") then failwith "Haiz"); name) }

关于c# - F# 结构构造函数中的参数验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12600574/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com