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

C#顶层委托引用无法解析,如何在测试类及其他方法中访问该委托

问题根因

C#语法不允许直接在命名空间作用域下声明变量/委托实例,命名空间下仅允许定义委托、类、接口等类型。你直接将stringToIntMapper委托实例写在测试类外部,属于命名空间层级的变量声明,本身不符合语法规范,因此编译器无法识别该引用。


解决方案

方案1:封装到静态类实现全局访问

如果你需要在多个类、方法中共用这个委托实例,最稳妥的方式是将其封装为静态类的静态成员:

// 委托类型声明可以放在命名空间下
delegate int Mapper(string str);

// 全局静态容器类
public static class MapperContainer
{
    // 加readonly防止实例被意外修改
    public static readonly Mapper stringToIntMapper = (string text) => { return int.Parse(text); };
}

public class MappingTests
{
    [Fact]
    public void MapFromStringToInt()
    {
        // 访问方式:静态类名.成员名
        var x = MapperContainer.stringToIntMapper("1");
        Assert.Equal(1, x);
    }
}

其他任意类只要能访问MapperContainer,都可以用同样的方式调用该委托实例。

方案2:测试类内部共用,直接声明为测试类成员

如果这个委托实例仅在当前测试类的所有测试方法里使用,直接放到测试类内部即可:

delegate int Mapper(string str);

public class MappingTests
{
    // 静态成员,类内所有方法可直接访问
    private static readonly Mapper stringToIntMapper = (string text) => { return int.Parse(text); };

    [Fact]
    public void MapFromStringToInt()
    {
        var x = stringToIntMapper("1");
        Assert.Equal(1, x);
    }

    // 其他测试方法也可以直接调用
    [Fact]
    public void AnotherTest()
    {
        var x = stringToIntMapper("123");
        Assert.Equal(123, x);
    }
}

方案3:顶层程序文件场景(.NET 6+)

如果你是在顶层语句的程序文件中声明,所有顶层代码默认会被编译到隐式的Program类中,你可以显式声明partial Program类来暴露该实例:

delegate int Mapper(string str);

// 显式声明partial Program类
static partial class Program
{
    public static readonly Mapper stringToIntMapper = (string text) => { return int.Parse(text); };
}

// 其他类访问方式:Program.stringToIntMapper
public class MappingTests
{
    [Fact]
    public void MapFromStringToInt()
    {
        var x = Program.stringToIntMapper("1");
        Assert.Equal(1, x);
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 02:21:02