лямбда-выражения в vb.net

public class Rule : MonoBehaviour{}
Rule rule2 = new Rule();

Вы не можете использовать ключевое слово new для создания нового экземпляра, если вы наследуете его из MonoBehaviour.

Вы должны получить исключение, говорит :

Вы пытаетесь создать MonoBehaviour, используя ключевое слово 'new'. Это запрещено. MonoBehaviours можно добавлять только с помощью AddComponent (). Кроме того, ваш скрипт может наследовать от ScriptableObject или вообще никакого базового класса

. Ваш код работал бы, если у вас public class Rule {}, но у вас есть public class Rule : MonoBehaviour {}.

Создание нового экземпляра класса, полученного из MonoBehaviour:

Пример класса:

public class Rule : MonoBehaviour
{
    public Rule(int i)
    {

    }
}

Если вы наследуете MonoBehaviour, вы должны либо используйте GameObject.AddComponent или Instantiate для создания нового экземпляра.

Rule rule2 = null;
void Start()
{
  rule2 = gameObject.AddComponent<Rule>();
}

ИЛИ

public Rule rulePrefab;
Rule rule2;
void Start()
{
    rule2 = Instantiate(rulePrefab) as Rule;
}

Если скрипт Rule уже существуют и прикреплены к GameObject, вам не нужно создавать / добавлять / создавать новые экземпляры этого сценария. Просто используйте функцию GetComponent, чтобы получить экземпляр скрипта из GameObject, к которому он присоединен.

Rule rule2;
void Start()
{
    rule2 = GameObject.Find("NameObjectScriptIsAttachedTo").GetComponent<Rule>();
}

Вы заметите, что вы не можете использовать параметр в конструкторе, когда вы выводите свой скрипт из MonoBehaviour .



Создание нового экземпляра класса, который НЕ выводится из MonoBehaviour:

Пример класса: (Обратите внимание, что он не является результатом " MonoBehaviour "

public class Rule
{
    public Rule(int i)
    {

    }
}

Если вы не наследуете от MonoBehaviour, вы должны использовать ключевое слово new для создания нового экземпляра. Теперь вы можете использовать параметр в конструкторе, если вы хотите.

Rule rule2 = null;

void Start()
{
    rule2 = new Rule(3);
}

EDIT:

В последней версии Unity создается новый экземпляр скрипта, который наследует от MonoBehaviour с помощью new может не дать вам ошибку и не может быть null слишком , но все функции обратного вызова не будут выполняться . К ним относятся функции Awake, Start, Update и другие. , вы все равно должны сделать это правильно, как указано в начале этого ответа.

5
задан Vertexwahn 4 March 2016 в 16:05
поделиться

5 ответов

Я не использовал VB.NET начиная с перемещения в C# 3.0, но кажется, что это могла быть проблема вывода типа. Ошибка немного нечетна, так как Список реализует IList, таким образом, присвоение должно работать. Можно сказать "p. Идентификатор = 123" для лямбды и вещей, кажется, работает.

Для кого-либо еще заинтересованного изучением его, вот код, который можно вставить в новый проект консоли VB.NET продемонстрировать эту проблему:

Module Module1
    Sub Main()
    End Sub
End Module

Class AccountGroup
    Public parent_id As Integer
    Public id As Integer
    Public sub_account_groups As List(Of AccountGroup)
End Class
Class AccountRepository
    Private _repository As AccountRepository

    Public Function GetAccountGroups() As IList(Of AccountGroup)
        Dim raw_account_groups As IList(Of AccountGroup)
        raw_account_groups = _repository.GetAccountGroups().ToList()
        Dim parents = (From ag In raw_account_groups _
                       Where ag.parent_id = 0 _
                       Select ag).ToList()
        parents(0).sub_account_groups = (From sag In raw_account_groups _
                                         Where sag.parent_id = 0 _
                                         Select sag).ToList()

        Dim sql_func As Func(Of AccountGroup, List(Of AccountGroup)) = Function(p) _
                                                                            (From sag In raw_account_groups _
                                                                             Where sag.parent_id = p.id _
                                                                             Select sag).ToList()



        parents.ForEach(Function(p) p.sub_account_groups = sql_func(p))
        Return parents
    End Function
 End Class
0
ответ дан 18 December 2019 в 10:51
поделиться

Принятый здесь ответ, вероятно, неверен из-за вашего кода. chyne дал верную подсказку: лямбда-выражения в VB всегда имеют возвращаемые значения (в отличие от C #), лямбда-выражения операторов вводятся в следующей версии.

Между тем, вы просто не можете использовать этот код в VB. Вместо этого используйте обычный цикл:

For Each p In parents
    p.sub_account_groups = sql_func(p)
Next

Следующая версия VB (доступная со вчерашнего дня в виде бета-версии) позволила бы написать следующий код:

parents.ForEach(Sub (p) p.sub_account_groups = sql_func(p))
8
ответ дан 18 December 2019 в 10:51
поделиться

Lambda в VB.Net должны возвращать значение, поэтому ваш знак равенства ('=') интерпретируется как сравнение (так что лямбда возвращает логическое значение), а не присваивание.

8
ответ дан 18 December 2019 в 10:51
поделиться

Думаю, ag.parent_id = 0 должно быть Где ag.parent_id == 0 ?

0
ответ дан 18 December 2019 в 10:51
поделиться

Используйте Sub для оператора присваивания:

parents.ForEach(Sub(p) p.sub_account_groups = sql_func(p))
0
ответ дан 18 December 2019 в 10:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: