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
相关产品推荐
相关产品推荐

