C# - Внутренняя ошибка компилятора Unity: "System.Runtime.CompilerServices.CallSite" CS0518 - при использовании динамической переменной

Использование MonoDevelop 4.0.1 для кодирования Unity 4.5.2f1

Код ниже является частью кода, который я использую, все переменные были проверены с помощью Debug.Log и все они (индивидуально) возвращают правильные значения.

Когда я обновляю свой актив скрипта в Unity, я получаю следующее сообщение об ошибке:

Внутренняя ошибка компилятора. Смотрите журнал консоли для получения дополнительной информации. вывод был: ошибка CS0518: предопределенный тип `System.Runtime.CompilerServices.CallSite'не определен или не импортирован

ошибка CS0518: предопределенный тип System.Runtime.CompilerServices.CallSite 1'не определено или не импортировано

ошибка CS0518: предопределенный тип `System.Runtime.CompilerServices.CallSite'не определен или не импортирован

ошибка CS0518: предопределенный тип System.Runtime.CompilerServices.CallSite 1'не определено или не импортировано

ошибка CS0518: предопределенный тип `System.Runtime.CompilerServices.CallSite'не определен или не импортирован

ошибка CS0518: предопределенный тип System.Runtime.CompilerServices.CallSite 1'не определено или не импортировано

ошибка CS0518: предопределенный тип `System.Runtime.CompilerServices.CallSite'не определен или не импортирован

ошибка CS0518: предопределенный тип System.Runtime.CompilerServices.CallSite 1'не определено или не импортировано

ошибка CS0518: предопределенный тип `System.Runtime.CompilerServices.CallSite'не определен или не импортирован

ошибка CS0518: предопределенный тип System.Runtime.CompilerServices.CallSite 1'не определено или не импортировано

ошибка CS0518: предопределенный тип `System.Runtime.CompilerServices.CallSite'не определен или не импортирован

ошибка CS0518: предопределенный тип System.Runtime.CompilerServices.CallSite 1'не определено или не импортировано

Вот разделы моего скрипта (упрощенно), вызывающие эту ошибку:

Примечание: я не могу разбить свою функцию на несколько маленьких функций. Моя функция должна оставаться как есть, я могу редактировать инструкцию возврата по мере необходимости

using UnityEngine;
using System.Collections;
using Random = UnityEngine.Random;

public class myScene : MonoBehaviour
{
    private dynamic someVar;
    private float myFloat = 1.1f;
    private string myString = "string";
    private int myInt = 2;

    void OnGUI()
    {
        someVar = myFunction(myFloat, myString, myInt);
    }

    //First Function
    public dynamic myFunction(float myFloat, string myString, int myInt)
    {
        //Do something
        dynamic myOtherFunction(myFloat, myString, myInt);
        float myFloat = myOtherFunction.myFloat;
        string myString = myOtherFunction.myString;
        int myInt = myOtherFunction.myInt;
        //Do something
        return new {myFloat = myFloat, myString = myString, myInt = myInt};
    }

    //Second function
    public dynamic myOtherFunction(float myFloat, string myString, int myInt)
    {
        //Do something
        return new {myFloat = myFloat, myString = myString, myInt = myInt};
    }
}

Я не смог выяснить, в чем проблема (да, даже с использованием Google, хотя некоторые возможные решения были найдены, я попробовал их, они, похоже, не решили мою проблему).

Мне нужно иметь возможность вернуть несколько переменных в OnGUI() функция из другой функции. Метод, который я использую return new{varName = value, ...}; Я нашел здесь. Я не могу использовать Tuples, так как Unity 4 MonoDevelop не поддерживает его (согласно этому сообщению), где пользователь разместил:

Нет, Unity не поддерживает кортежи. Может быть, когда Unity обновит свою версию Mono для поддержки функций, входящих в.NET Framework 4.

В конечном итоге я хотел бы реализовать следующий код в OnGUI() функция:

myFloat = myFunction.myFloat;
myString = myFunction.myString;
myInt = myFunction.myInt

Любая помощь в этом с благодарностью, спасибо

1 ответ

Решение

Вы столкнулись с той же проблемой, что и с Tuples. dynamic был введен в.Net Framework 4.0 и требует динамической языковой среды выполнения (DLR), которой нет в версии Mono для Unity.

При этом, учитывая контекст, который у вас есть, ваша заметка о том, что "моя функция должна оставаться такой, как я могу редактировать оператор возврата по мере необходимости", показывает, что вам не нужны ваши текущие настройки вообще. Я действительно не могу понять, почему вы не можете использовать объект для хранения значений (используемые вами имена очень затрудняют создание логических имен для примера):

    public class MyFunctionResult
    {
        public readonly float MyFloat;
        public readonly string MyString;
        public readonly int MyInt;

        public MyFunctionResult(float myFloat, string myString, int myInt)
        {
            MyFloat = myFloat;
            MyString = myString;
            MyInt = myInt;
        }
    }

    void OnGUI()
    {
        float myFloat = 1;
        string myString = "";
        int myInt = 2;
        var finalResult = myFunction(myFloat, myString, myInt);
        Debug.Log(finalResult.MyFloat); //...
    }

    //First Function
    public MyFunctionResult myFunction(float myFloat, string myString, int myInt)
    {
        //Do something
        var myOtherFunctionResult = myOtherFunction(myFloat, myString, myInt);
        float myFloatResult = myOtherFunctionResult.MyFloat;
        string myStringResult = myOtherFunctionResult.MyString;
        int myIntResult = myOtherFunctionResult.MyInt;
        //Do something
        return new MyFunctionResult(myFloat, myString, myInt);
    }

    //Second function
    public MyFunctionResult myOtherFunction(float myFloat, string myString, int myInt)
    {
        //Do something
        return new MyFunctionResult(myFloat, myString, myInt);
    }

Я очень старался придумать хотя бы незначительную причину и не смог (но мне интересно, скрывает ли ваше упрощение скрытую проблему). При этом, вы также можете использовать out параметры, но я бы определенно назвал это неправильным использованием:

public dynamic myFunction(float myFloat, string myString, int myInt)
{
    //Do something

    float myFloat;
    string myString;
    int myInt;
    myOtherFunction(out myFloat,out myString,out myInt);
    ...
}
public void myOtherFunction(out float myFloat, out string myString, out int myInt)
{
    myFloat = someVal;
    myString = otherVal;
    myInt = thirdVal;

    return;
}
Другие вопросы по тегам