小编Ron*_*omb的帖子

lambda表达式中的枚举编译方式不同; 重载分辨率提高的结果?

在尝试Visual Studio 2015 RC时,我收到了以前正在运行的代码的运行时错误.给定(x => x.CustomerStatusID == CustomerStatuses.Active)作为a传递给函数的lambda Expression<>,调试器在表达式树中显示差异.以前编译为:

.Lambda #Lambda1<System.Func`2[Services.DataClasses.CustomerDC,System.Boolean]>(Services.DataClasses.CustomerDC $x)
{
    (System.Int32)$x.CustomerStatusID == 0
}
Run Code Online (Sandbox Code Playgroud)

但是在C#6.0中它现在编译为

.Lambda #Lambda1<System.Func`2[Services.DataClasses.CustomerDC,System.Boolean]>(Services.DataClasses.CustomerDC $x)
{
    (System.Int32)$x.CustomerStatusID == (System.Int32).Constant<Services.DataClasses.CustomerStatuses>(Active)
}
Run Code Online (Sandbox Code Playgroud)

虽然我的树遍历代码的修复是直截了当的,并且额外的细节是值得赞赏的,有没有人知道任何其他陷阱漂浮这样?

或者,是否有人链接到有关如何改进重载决策的细节的信息?我找不到任何东西.

c# lambda enums roslyn c#-6.0

68
推荐指数
1
解决办法
1954
查看次数

Typescript 接口中带有可选项目的固定长度数组

Angular 通过 FormBuilder 类引入了模型驱动表单,该类的主要方法group具有如下签名:

group(controlsConfig: {
        [key: string]: any;
    }): FormGroup;
Run Code Online (Sandbox Code Playgroud)

实际上是any一个格式如下的数组:

[
    initial value of model's property, 
    sync validator(s), 
    async validator(s)
]
Run Code Online (Sandbox Code Playgroud)

仅需要第一个元素的地方。

我决定我想要比这更强类型的东西,特别是与强类型模型相关的任何东西,所以我根据 T 重新定义了该函数:

declare interface FormBuilder2 extends FormBuilder {
    group<T>(controlsConfig: {
        [K in keyof T]?: [T[K], ValidatorFn | ValidatorFn[] | null, ValidatorFn | ValidatorFn[] | null];
    }): FormGroup;
}
Run Code Online (Sandbox Code Playgroud)

这也意味着 HTML 中的所有 formControlName(当然还有这里的 group() 调用)必须与模型的属性匹配,这是我更喜欢的。

这似乎可行,但有一个问题:

    this.optionsForm = this.formBuilder2.group<CustomerModel>({
        status:    [this.model.status, [Validators.required], null],
        lastOrder: [this.model.lastOrder, null, null],
        comments:  [this.model.comments, null, null],
    }); …
Run Code Online (Sandbox Code Playgroud)

generics interface typescript angular2-formbuilder angular

7
推荐指数
1
解决办法
7226
查看次数