C# - Unity内部编译器错误:“System.Runtime.CompilerServices.CallSite”CS0518 - 使用动态变量时

时间:2014-09-27 01:17:47

标签: c# unity3d return monodevelop internal-compiler-error

使用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'未定义或   进口

以下是导致此错误的脚本部分(简化):

注意:我无法将我的功能分解为多个小功能。 我的功能必须保持原样我可以根据需要编辑return语句

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

我一直无法弄清问题是什么(是的,即使使用谷歌,虽然出现了一些可能的解决方案,我尝试过,但他们似乎没有解决我的问题。)

我需要能够从另一个函数向OnGUI()函数返回多个变量。我正在使用的方法return new{varName = value, ...};我找到了here。我不能使用Tuples作为Unity 4 MonoDevelop不支持它(根据this帖子)用户发布的地址:

  

不,Unity不支持元组。也许当Unity升级其Mono版本以支持.NET Framework 4中的功能时。

最后,我想在OnGUI()函数中实现以下代码:

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

非常感谢任何帮助, 谢谢

1 个答案:

答案 0 :(得分:3)

您遇到了与Tuples相同的问题。 dynamic是在.Net Framework 4.0中引入的,需要动态语言运行时(DLR),它不会出现在Unity的Mono版本中。

话虽如此,根据你在这里的背景你的说明陈述"我的功能必须保持原样我可以根据需要编辑return语句"表明您根本不需要当前的设置。我真的无法理解为什么你不能使用一个对象来保存这些值(你使用的名称很难为一个例子提供逻辑名称):

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