2012-10-23 34 views
3

我需要一些帮助翻译从C#此代码vb.net:需要帮助翻译功能从C#到vb.net

private static Action<int, int> TranslateOrigin(Action<int, int> f, int x, int y) 
    { 
     return (a, b) => f(a + x, b + y); 
    } 

自动翻译,我发现在互联网上做的是一个烂摊子,生产:

Private Shared Function TranslateOrigin(f As Action(Of Integer, Integer), x As Integer, y As Integer) As Action(Of Integer, Integer) 
    Return Function(a, b) f(a + x, b + y) 
End Function 

哪些不会编译,抱怨“表达式不生成值”。 我一直在戳它一会儿,并没有任何运气翻译它,任何帮助将不胜感激。

+0

+1自动翻译人员的lambda表达式垃圾。 – MarkJ

回答

4

我觉得这是一个有点接近,因为它没有返回值,而是一个动作。使用一条线。

Public Shared Function TranslateOrigin(f As Action(Of Integer, Integer), x As Integer, y As Integer) As Action(Of Integer, Integer) 
    Return Sub(a, b) f(a + x, b + y) 
End Function 
1

这应做到:

Private Shared Function TranslateOrigin(ByVal f As Action(Of Integer, Integer), ByVal x As Integer, ByVal y As Integer) As Action(Of Integer, Integer) 
    Return Function (ByVal a As Integer, ByVal b As Integer) 
       f.Invoke((a + x), (b + y)) 
      End Function 
End Function 
+0

Stil在我的部分有错误。 – Styxxy

0

您知道吗?Action(Of T1, T2) delegate不会返回值?如果它无论如何都是你想要的(尽管我没有在其中看到很多关于值的类型),你可以使用Sub。

封装具有两个参数且不返回值的方法。

随着子,这将使该代码:

Private Shared Function TranslateOrigin(f As Action(Of Integer, Integer), x As Integer, y As Integer) As Action(Of Integer, Integer) 
    Return Sub(a, b) f(a + x, b + y) 
End Function 

你可能想返回一个值,为此你需要一个Func(Of T1, T2, TResult) delegate。在你的情况,这将使:

Private Shared Function TranslateOrigin(f As Func(Of Integer, Integer, Integer), x As Integer, y As Integer) As Func(Of Integer, Integer, Integer) 
    Return Function(a, b) f(a + x, b + y) 
End Function 

如下调用它,将返回值6(因为我猜预计):

TranslateOrigin(Function(x, y) x + y, 1, 2)(1, 2)