【问题标题】:Converting ObjC Blocks to C# Lambdas将 ObjC 块转换为 C# Lambda
【发布时间】:2014-06-01 02:39:10
【问题描述】:

我需要一些帮助将 Objective-C 块转换为 C#。

这里是源 ObjC:

NSDate* addYear = [_calendar dateByAddingComponents:((^{
        NSDateComponents* components = [NSDateComponents new];
        components.month = 12;
        return components;
    })()) toDate:now options:0];

现在我在 C# 中尝试了以下操作:

NSDate date = _calendar.DateByAddingComponents((() => {
            NSDateComponents components = new NSDateComponents();
            components.Month = 12;
            return components;
        })(), now, NSCalendarOptions.None);

我得到以下编译器错误:Expression denotes a 'anonymous method' where a 'method group' was expected

删除 lambda 周围的括号会产生 Cannot convert 'lambda expression' to non-delegate type 'MonoTouch.Foundation.NSDateComponents'

什么是正确的 C# 语法?我需要保留闭包,因为我要移植的代码库中还有很多。

【问题讨论】:

  • DateByAddingComponents 方法的签名是什么?
  • @SteveMitcham 在 Mono 中,它采用 NSDateComponents 对象。
  • 在定义 lambda 后尝试删除 (),因此最后一行将是 ''}),现在,NSCal....'

标签: c# objective-c mono xamarin.ios


【解决方案1】:

这应该可行:

        var date = calendar.DateByAddingComponents (
            new NSDateComponents () 
            {
                Month = 12
            },
            NSDate.Now,
            NSCalendarOptions.None);

编辑:您可能需要一个 Func:

        Func<NSDateComponents> func = () => new NSDateComponents () { Month = 12 };

        date = calendar.DateByAddingComponents (func (), NSDate.Now, NSCalendarOptions.None);

方法内:

        date = calendar.DateByAddingComponents (
            (new Func<NSDateComponents>(()=> new NSDateComponents () { Month = 12 }))(),
            NSDate.Now,
            NSCalendarOptions.None);

【讨论】:

  • 谢谢,但据我所知,关闭是原始开发人员故意的。我移植的源代码中有很多闭包。
  • 好的。我编辑了答案,我希望这就是你要找的。​​span>
  • 感谢@SKall,正是我所追求的。
猜你喜欢
  • 1970-01-01
  • 2011-05-08
  • 2023-04-02
  • 1970-01-01
  • 2011-02-10
  • 2015-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多