是否有一种与C#和#x27相当的语言;F#中(..)的名称?

是否有一种与C#和#x27相当的语言;F#中(..)的名称?,c#,f#,C#,F#,我有以下几行代码要从C移植到F: TypeName的值为“MyClass”,MemberName的值为“MyMember”。我必须用F#写什么?从F#4.7开始,有一个: let月= [ “一月”、“二月”、“三月”、“四月”; “五月”、“六月”、“七月”、“八月”、“九月”; “十月”、“十一月”、“十二月” ] 让我们每月查找一次= 如果(月>12 | |月

我有以下几行代码要从C移植到F:

TypeName
的值为
“MyClass”
MemberName
的值为
“MyMember”
。我必须用F#写什么?

从F#4.7开始,有一个:

let月=
[
“一月”、“二月”、“三月”、“四月”;
“五月”、“六月”、“七月”、“八月”、“九月”;
“十月”、“十一月”、“十二月”
]
让我们每月查找一次=
如果(月>12 | |月<1),则
invalidArg(nameof month)($“传入的值为%d{month}。”)
月份。[第1个月]
打印fn“%s”(查找第12个月)
打印fn“%s”(查找月份1)
打印fn“%s”(查找第13个月)

如评论中所述,操作员的适当
名称为“正在工作”

同时,您可以使用F#引号(类似于C#表达式树)来实现类似的功能-这有点难看,需要一些规则(您需要在引号中放入实际的成员访问权限),但它至少会检查成员是否存在,并防止键入错误:

open Microsoft.FSharp.Quotations

let nameof (q:Expr<_>) = 
  match q with 
  | Patterns.Let(_, _, DerivedPatterns.Lambdas(_, Patterns.Call(_, mi, _))) -> mi.Name
  | Patterns.PropertyGet(_, mi, _) -> mi.Name
  | DerivedPatterns.Lambdas(_, Patterns.Call(_, mi, _)) -> mi.Name
  | _ -> failwith "Unexpected format"

let any<'R> : 'R = failwith "!"

看起来它仍在实施中-。另请参见nameof是一个预览功能,从F#4.7开始,它看起来像是一个真正的方法,但我认为我必须等待
nameof
操作符的实现,因为我需要将结果作为编译时常量(希望将其用作ATTDribution的参数)。此外,我只能获取成员的名称,但不能获取类型的名称,这是对的吗?@David-你是对的,这不是编译时常量,你只能获取成员名称(对于类型名称,你可能只需要
typeof.Name
,但这与C中的情况相同-
nameof
会更好!)TomasPetricek请看
open Microsoft.FSharp.Quotations

let nameof (q:Expr<_>) = 
  match q with 
  | Patterns.Let(_, _, DerivedPatterns.Lambdas(_, Patterns.Call(_, mi, _))) -> mi.Name
  | Patterns.PropertyGet(_, mi, _) -> mi.Name
  | DerivedPatterns.Lambdas(_, Patterns.Call(_, mi, _)) -> mi.Name
  | _ -> failwith "Unexpected format"

let any<'R> : 'R = failwith "!"
nameof <@ any<System.Random>.Next @>
nameof <@ System.Char.IsControl @>