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;
}