2015-01-30 2 views
-1

Как передать параметр в инструкцию как метод. У меня есть метод, как этот я пытаюсь стимулировать тройной оператор в C# в vb.net без использования IIF ключевого словаКак передать метод в качестве параметра действия

Protected Friend Sub TernaryOperater(ByVal condition As Boolean, _ 
    ByVal truePart As action, Optional ByVal falsePart As action = Nothing) 
    If condition Then 
     truePart() 
    Else 
     falsePart() 
    End If 
End Sub 

и я называю этот метод следующим образом:

TernaryOperater(DataGridView1.Rows.Count > 0, _ 
    tp21txtBillNo.Clear, tp21txtBillNo.focus) 

Он показал красный цвет ошибки по заявлению tp21txtBillNo.clear и tp21txtBillNo.focus. Action не поддерживается в таких заявлениях?

(Смотрит как для C# и VB.Net варианты)

+2

Как точно она не работает? – Chris

+1

Кстати, это уже существует в VB.NET, это функция 'Iif': https://msdn.microsoft.com/en-us/library/27ydhh0d%28v=vs.90%29.aspx. VB2008 также представляет краткосрочную версию, замыкающий оператор 'If (c, t, f)', который работает аналогично, но лучше. – Dai

+1

Похоже, вы просто хотите использовать оператор 'If' - вы ничего не возвращаете от своего« оператора ». Предполагается, что условный оператор используется как выражение, а не оператор. – Blorgbeard

ответ

2

Синтаксис для передачи Действие/Func в VB/Net:

TernaryOperater(true, Function() OneArg(42), AddressOf NoArgs) 

Подробнее:

Прежде всего, чтобы быть реальным «тернарный оператор» (правильно названный «условный оператор»), вы должны использовать Func<T> в качестве аргумента, чтобы он мог вернуть результат.

Метод подписи вы передаете в качестве Func<T> или Action<T> должны соответствовать типу - функция без аргументов и возвращать тип T для Func<T>, функция (суб) без аргументов для Action<T>. Если он не совпадает - вы можете обернуть его в линию с лямбда-выражения - lambda expressions in VB.Net:

C#: INT дважды (INT значение) {вернуться 2 * Значение;} INT Half (целое значение) {вернуть 2 * значение; }

T Ternary<T>(bool condition, Func<T> onTrue, Func<T> onFalse) 
{ 
    return condition ? onTrue() : onFalse(); 
} 

void StrangeIf(bool condition, Action onTrue, Action onFalse) 
{ 
    if (condition) 
     onTrue() 
    else 
     onFalse(); 
} 
... 

StrangeIf(true, ignore => Twice(42), ignore => Halhf(42)); 
var r = Ternary<int>(true, ignore => Twice(42), ignore => Halhf(42)); 

VB.Net:

Function TernaryOperater(Of T)(condition As Boolean, _ 
      onTrue As Func(Of T), onFalse As Func(Of T)) As T 
    If condition Then 
     return onTrue() 
    Else 
     return onFalse() 
    End If 
End Function 

Sub StrangeIf(condition As Boolean, _ 
      onTrue As Action, onFalse As Action) 
    If condition Then 
     onTrue() 
    Else 
     onFalse() 
    End If 
End Sub 

Function Twice(v as Integer) 
    return v * 2 
End Function 

StrangeIf(true, Function() Twice(42), Function() Twice(1)) 
+0

Func (of T) отображается под красной ошибкой линии. Это siad. Тип T не определен. –

+0

Я взял на себя смелость исправить код VB.NET – sloth

+0

@sloth спасибо за обновление кода. –

Смежные вопросы