You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使Unity库兼容新旧C#版本的#nullable启用指令?

解决Unity库兼容新旧版本的Nullable特性问题

你遇到的核心问题是:旧版C#编译器会解析#if块内的陌生编译指令(比如#nullable),哪怕条件不成立——因为这类编译指令的处理逻辑和普通预处理器分支不同,旧编译器无法识别#nullable,直接抛出无效指令错误。

以下是几种可行的兼容方案:

方案1:通过Assembly Definition(asmdef)配置全局Nullable

这是最简洁的方案,无需修改代码:

  • 在你的Unity库中创建/编辑.asmdef文件,针对Unity 2021.3+版本,在CompilerOptions字段中添加"-nullable enable":
    {
      "name": "MyLibrary",
      "CompilerOptions": "-nullable enable",
      "DefineConstraints": ["UNITY_2021_3_OR_NEWER"]
    }
    
  • 针对旧版本Unity,创建另一个不带CompilerOptions的.asmdef,或者通过DefineConstraints控制启用条件。
    这样新版项目自动启用Nullable,旧版项目完全不会接触到相关指令。

方案2:拆分代码文件隔离Nullable逻辑

将依赖Nullable特性的代码和兼容代码拆分为独立文件,通过条件编译控制编译范围:

  • 创建MyLibrary.Nullable.cs,仅在新版Unity中编译:
    #if UNITY_2021_3_OR_NEWER
    #nullable enable
    
    // 这里编写带Nullable注解的代码,比如:
    public void DoSomething(string nonNullParam)
    {
        // ...
    }
    
    #endif
    
  • 创建MyLibrary.Legacy.cs,仅在旧版Unity中编译:
    #if !UNITY_2021_3_OR_NEWER
    
    // 这里编写不带Nullable的兼容代码,比如:
    public void DoSomething(string nonNullParam)
    {
        // ...
    }
    
    #endif
    

旧版本编译器只会编译Legacy文件,完全看不到#nullable指令,从根源避免报错。

方案3:用C#版本符号精准控制

因为Nullable是C# 8.0引入的特性,你可以直接基于C#版本判断,比Unity版本更精准:

  1. 在Unity 2021.3+项目的PlayerSettings > Other Settings > Scripting Define Symbols中添加CSHARP_8_OR_NEWER。
  2. 在代码中用该符号包裹Nullable指令:
#if CSHARP_8_OR_NEWER
#nullable enable
#endif

// 库的核心代码

#if CSHARP_8_OR_NEWER
#nullable restore
#endif

旧版本编译器不认识CSHARP_8_OR_NEWER,会直接跳过整个#if块,不会解析里面的#nullable指令。

内容的提问来源于stack exchange,提问作者lufinkey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 12:20:35