2014-09-27 2 views
0

Использование MonoDevelop 4.0.1 для кодирования единства 4.5.2f1C# - Unity Internal Compiler Error: "System.Runtime.CompilerServices.CallSite" CS0518 - при использовании динамической переменной

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

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

Internal compiler error. See the console log for more information. output was:error CS0518: The predefined type `System.Runtime.CompilerServices.CallSite' is not defined or imported

error CS0518: The predefined type System.Runtime.CompilerServices.CallSite 1' is not defined or imported

error CS0518: The predefined type `System.Runtime.CompilerServices.CallSite' is not defined or imported

error CS0518: The predefined type System.Runtime.CompilerServices.CallSite 1' is not defined or imported

error CS0518: The predefined type `System.Runtime.CompilerServices.CallSite' is not defined or imported

error CS0518: The predefined type System.Runtime.CompilerServices.CallSite 1' is not defined or imported

error CS0518: The predefined type `System.Runtime.CompilerServices.CallSite' is not defined or imported

error CS0518: The predefined type System.Runtime.CompilerServices.CallSite 1' is not defined or imported

error CS0518: The predefined type `System.Runtime.CompilerServices.CallSite' is not defined or imported

error CS0518: The predefined type System.Runtime.CompilerServices.CallSite 1' is not defined or imported

error CS0518: The predefined type `System.Runtime.CompilerServices.CallSite' is not defined or imported

error CS0518: The predefined type System.Runtime.CompilerServices.CallSite 1' is not defined or imported

Здесь находятся участки моего скрипта (упрощенный) вызывает эту ошибку:

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

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, ...}; Я нашел here. Я не могу использовать кортежи в Unity 4 MonoDevelop не поддерживает (в соответствии с this поста), где отвечал пользователь:

No, Unity does not support Tuples. Maybe when Unity upgrades its Mono version to support features that came in .NET Framework 4.

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

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

Любая помощь с этим оценивается, Спасибо

+0

Когда вы облегчите пример быть осторожным, чтобы не идти _too_ далеко. Вы повторно используете имена параметров в качестве локальных имен переменных, и он иссушает актуальную проблему. –

+0

Мои извинения, я немного упростил это, спасибо за понимание того, что я делал. Вы оказали огромную помощь – ctwheels

+0

Я получал эту ошибку в своем модульном тестовом проекте и динамически компилировал скрипт C# с помощью CSharpCodeProvider.Добавление ссылки на «System.Core.dll» на CompilerParameters.ReferencedAssemblies решила проблему для меня. – Patel

ответ

3

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

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

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

Большое спасибо, это сработало отлично. Я не знал, что динамика имеет те же проблемы, что и Tuple. Мне потребовалось некоторое время, чтобы реализовать, но первый раздел/ответ, который вы предоставили, работали как шарм. еще раз спасибо – ctwheels