Unity使用XLua插件报错 ReadOnlySpan<> & Span<> 解决方法

该文章已生成可运行项目,

1.在Project窗口搜索ExampleConfig

 

 2.打开后Ctrl+F搜索UNITY_2018_1_OR_NEWER

3.在其中加一段代码,忽略掉Span<>和ReadOnlySpan<>,并保存

[BlackList]
public static List<Type> BlackGenericTypeList = new List<Type>() 
{
    typeof(Span<>), 
    typeof(ReadOnlySpan<>)
};
private static bool IsBlacklistedGenericType(Type type) 
{
    if (!type.IsGenericType) return false;
    return BlackGenericTypeList.Contains(type.GetGenericTypeDefinition());
}

[BlackList]
public static Func<MemberInfo, bool> GenericTypeFilter = (memberInfo) => 
{
    switch (memberInfo)
    {
        case PropertyInfo propertyInfo:
            return IsBlacklistedGenericType(propertyInfo.PropertyType);
        case ConstructorInfo constructorInfo:
            return constructorInfo.GetParameters().Any(p => IsBlacklistedGenericType(p.ParameterType));
        case MethodInfo methodInfo:
            return methodInfo.GetParameters().Any(p => IsBlacklistedGenericType(p.ParameterType));
        default:
            return false;
    }
};

4.清除后在重新生成即可

相关链接:ToLua中的解决方法Unity中ToLua The type ReadOnlySpan<> & Span<> may not be used as a type argument 解决方法-优快云博客

本文章已经生成可运行项目
错误 **CS0306** 是在使用 **XLua** 生成 C# 代码时遇到的典型问题,它通常发生在尝试将不被允许的类型(如 `ReadOnlySpan&lt;int&gt;`)作为泛型参数传递时。此问题的根本原因是 C# 泛型系统对某些特殊类型(如 `ReadOnlySpan&lt;T&gt;`、`Span&lt;T&gt;`)的限制,它们不能作为泛型类型参数使用,因为这些类型依赖于运行时的特定支持。 ### 错误原因 `ReadOnlySpan&lt;int&gt;` 是 .NET Core 2.1 引入的一种高性能类型,用于表示连续内存区域的只读视图。由于其特殊的性质,它不能直接用作泛型类型参数。XLua 在生成代码时,如果反射到包含此类类型的泛型类或方法,会触发此错误 [^5]。 ### 解决方案 #### 1. 避免直接使用 `ReadOnlySpan&lt;T&gt;` 作为泛型参数 可以将 `ReadOnlySpan&lt;int&gt;` 转换为兼容的类型,例如 `int[]` 或 `List&lt;int&gt;`,以绕过泛型限制。 ```csharp // 原始代码(可能触发错误) SomeGenericMethod(ReadOnlySpan&lt;int&gt; data); // 修改后 int[] dataArray = data.ToArray(); SomeGenericMethod(dataArray); ``` #### 2. 使用类型别名或封装类型 如果必须使用 `ReadOnlySpan&lt;int&gt;`,可以考虑将其封装在一个类中,然后在 XLua 调用时使用该封装类。 ```csharp public class IntSpanWrapper { public ReadOnlySpan&lt;int&gt; Value { get; } public IntSpanWrapper(ReadOnlySpan&lt;int&gt; value) { Value = value; } } ``` #### 3. 修改 XLua 的代码生成逻辑 如果使用的是自定义 XLua 版本或需要深度集成,可以修改其代码生成逻辑,跳过或特殊处理 `ReadOnlySpan&lt;T&gt;` 类型的泛型参数检查。此方法较为复杂,建议仅在必要时使用。 #### 4. 使用 `#if UNITY_EDITOR` 或条件编译 如果问题仅在 Unity Editor 中出现,可以在生成代码时使用条件编译排除相关代码,或者在 Editor 中使用替代类型。 ```csharp #if UNITY_EDITOR // 使用替代类型 public List&lt;int&gt; DataForEditor; #else public ReadOnlySpan&lt;int&gt; Data; #endif ``` #### 5. 升级 XLua 和 .NET 版本 确保使用XLua 版本支持最新的 .NET 特性。某些旧版本的 XLua 可能无法正确处理 `ReadOnlySpan&lt;T&gt;` 类型。升级到最新版本可能会修复此类问题。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值