C# Func的泛型隐式强制转换<;T、 T>;托特

C# Func的泛型隐式强制转换<;T、 T>;托特,c#,generics,C#,Generics,我有这段代码,灵感来自javascript的自初始化匿名函数 public static Contact Login(string username, string passwordHash = null) { return ((Func<Contact, Contact>)(c => { if (c != null) { var context = new CurrentContext();

我有这段代码,灵感来自javascript的自初始化匿名函数

public static Contact Login(string username, string passwordHash = null)
{
    return ((Func<Contact, Contact>)(c => {
            if (c != null) {
                var context = new CurrentContext();
                context.Contact = c;
                context.Save();
            }
            return c;
        }))(GetContactFromDatabase(username) ?? GetContactFromWebService(username, passwordHash));
}
也许有一种聪明的扩展方法可以实现这种语法

我最终在一个没有名称空间的类中使用了以下命令:

public delegate T F<T>(T value);

public static class GenericExtensions {
    [DebuggerStepThrough]
    public static T For<T>(this F<T> function, T value) {
        return function(value);
    }
}
公共委托tf(T值);
公共静态类GenericExtensions{
[调试步骤至]
公共静态T(此F函数,T值){
返回函数(值);
}
}

简单一点,避免使用lambda:

public static Contact Login(string username, string passwordHash = null)
{
    Contact c = GetContactFromDatabase(username) ?? GetContactFromWebService(username, passwordHash);

    if (c != null) {
       var context = new CurrentContext();
       context.Contact = c;
       context.Save();
    }

    return c;
}

简单一点,避免使用lambda:

public static Contact Login(string username, string passwordHash = null)
{
    Contact c = GetContactFromDatabase(username) ?? GetContactFromWebService(username, passwordHash);

    if (c != null) {
       var context = new CurrentContext();
       context.Contact = c;
       context.Save();
    }

    return c;
}

如果不使用匿名函数,而是使用委托,则可以实现您的目的

public delegate int Contacts(int a, int b);

    public static class TestClass
    {
        public static void Test()
        {            
            Contacts contactsFunc = (Contacts)((a, b) => a + b);
            contactsFunc(2, 3);
            //less verbose mode
            ((Contacts)((a, b) => a + b))(2,3);
        }
    }
但是我必须同意wdosanjos,并告诉你不要使用lambdas


旁注:将Javascript编程风格映射到c#可能不是最好的指南(免责声明:但我不太喜欢Javascript)

如果您不使用匿名函数,而是使用委托,则可以实现您的意图

public delegate int Contacts(int a, int b);

    public static class TestClass
    {
        public static void Test()
        {            
            Contacts contactsFunc = (Contacts)((a, b) => a + b);
            contactsFunc(2, 3);
            //less verbose mode
            ((Contacts)((a, b) => a + b))(2,3);
        }
    }
但是我必须同意wdosanjos,并告诉你不要使用lambdas


旁注:将Javascript编程风格映射到c语言可能不是最好的指南(免责声明:但我不太喜欢Javascript)

为什么?问题是为什么要这样做?如果将匿名代码块提取到单独的函数中,它的可读性会不会更高?对不起,我在第二个代码块中也没有看到任何“糖”。Syntax sugar通常意味着一些优雅的代码,但上面的代码不是这样的
Login
方法如果您完全避免使用lambda表达式并以简单的方式编写它,那么它的可读性会更好(实际上也不会太冗长)。为什么?问题是为什么要这样做?如果将匿名代码块提取到单独的函数中,它的可读性会不会更高?对不起,我在第二个代码块中也没有看到任何“糖”。Syntax sugar通常意味着一些优雅的代码,但上面的一段并非如此如果您完全避免使用lambda表达式并以简单的方式编写它,
Login
方法将更具可读性(实际上更不冗长)。您为什么说不使用lambda?模式有什么问题?使用lambda会使代码更加复杂。越简单越好。lambda作为方法引用的类型安全抽象有一些好处,但是这里不需要间接寻址。为什么你说不使用lambda?模式有什么问题?使用lambda会使代码更加复杂。越简单越好。lambda作为方法引用的类型安全抽象有一些好处,但这里不需要间接寻址。