MerlinVR / UdonSharp

An experimental compiler for compiling C# to Udon assembly
MIT License
671 stars 88 forks source link

Code that uses Color32 does not compile unless specifically using byte variables as arguments #69

Open poi-vrc opened 3 years ago

poi-vrc commented 3 years ago

Describe the bug in detail: Consider the following code that is expected to compile correctly:


using UdonSharp;
using UnityEngine;
using VRC.SDKBase;
using VRC.Udon;

public class TestScript : UdonSharpBehaviour
{

    private Color32 color;

    void Start()
    {
        color = new Color32(0xC0, 0xD6, 0xDF, 0xFF);
    }
}

UdonSharp throws the following error stating the constructor cannot be found and fails the compilication:

[<color=#FF00FF>UdonSharp</color>] Assets\poiOS\Scripts\TestScript.cs(15,46): System.Exception: Could not find valid method for given parameters!

However, by specifically declaring byte variables and supplying into the constructor, the error no longer exists:


using UdonSharp;
using UnityEngine;
using VRC.SDKBase;
using VRC.Udon;

public class TestScript : UdonSharpBehaviour
{

    private Color32 color;

    void Start()
    {
        byte r = 0xC0;
        byte g = 0xD6;
        byte b = 0xDF;
        byte a = 0xFF;
        color = new Color32(r, g, b, a);
    }
}

I think C# seems to consider those hard-coded bytes as type Int32 instead of Byte and then auto-cast back to byte while compilication. UdonSharp seems trying to find the constructor Color32(Int32, Int32, Int32, Int32) which does not exist and fails the complication.

Expected behavior: What was the expected result? To compile

MerlinVR commented 3 years ago

Known issue that will be fixed eventually, but it's complicated. Using an explicit cast in the constructor like new Color32((byte)0xC0, (byte)0xD6, (byte)0xDF, (byte)0xFF) also works as a workaround.