枚举类型使用扩展方法遇编译错误:扩展方法无法访问
C#编译器无法识别同一命名空间下的枚举扩展方法?
测试代码如下:
namespace ABC.ACSUnitySDKTest { [TestFixture] public class AudioStreamSampleRateExTests { [Test] public void ToHz_16000Hz_ReturnsCorrectValue() { var result = AudioStreamSampleRate.Hz_16000.ToHz(); // <-- ERROR! .ToHz() is not defined! Assert.That(result, Is.EqualTo(16000)); } } }
完整错误信息:
CS1061 'AudioStreamSampleRate' does not contain a definition for
'ToHz' and no accessible extension method 'ToHz' accepting a first
argument of type 'AudioStreamSampleRate' could be found (are you
missing a using directive or an assembly reference?)
扩展方法定义代码:
namespace ABC { internal static class AudioStreamSampleRateEx { public static int ToHz(this AudioStreamSampleRate sampleRate) { return sampleRate switch { AudioStreamSampleRate.Hz_16000 => 16000, AudioStreamSampleRate.Hz_22050 => 22050, AudioStreamSampleRate.Hz_24000 => 24000, AudioStreamSampleRate.Hz_32000 => 32000, AudioStreamSampleRate.Hz_44100 => 44100, AudioStreamSampleRate.Hz_48000 => 48000, _ => throw new NotImplementedException() }; } } }
问题原因
核心问题出在扩展方法所在静态类的访问修饰符:AudioStreamSampleRateEx被标记为internal,该修饰符限定类只能在同一程序集内被访问。
你的测试代码位于ABC.ACSUnitySDKTest命名空间,属于独立的测试程序集(即便命名空间是ABC的子空间),跨程序集时internal类无法被访问,因此编译器找不到ToHz扩展方法。
解决办法
- 修改访问修饰符:将
AudioStreamSampleRateEx的internal改为public,让测试程序集能直接访问该静态类及其中的扩展方法。 - 保持internal并授权访问:若不想修改原类的访问级别,可在原项目的
AssemblyInfo.cs中添加如下代码,允许测试程序集访问原程序集的internal成员:[assembly: InternalsVisibleTo("ABC.ACSUnitySDKTest")]
内容的提问来源于stack exchange,提问作者Kamran Bigdely
相关产品推荐
相关产品推荐

