在枚举类型上使用扩展方法会导致编译错误

问题描述 投票:0回答:1

我正在为枚举类型定义的扩展方法编写单元测试。这是一个测试

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”不包含定义 “ToHz”并且没有可访问的扩展方法“ToHz”接受第一个 可以找到“AudioStreamSampleRate”类型的参数(您是 缺少 using 指令或程序集引用?)

但是扩展方法已定义,C# 编译应该已经看到:

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()
            };
        }
    }
}

那么为什么 C# 编译器看不到扩展方法 .ToHz()?

注意:我们不需要添加“using”语句,因为它们都位于同一名称空间中。无论如何,我添加了 'using' 语句并没有解决问题。

c# unit-testing enums
1个回答
0
投票

我意识到为什么C#编译器看不到扩展方法了。扩展方法类 AudioStreamSampleRateEx 上的访问修饰符 internal 阻止此类,从而阻止测试类 AudioStreamSampleRateExTests 中访问扩展方法。

为了修复它,我添加了这个属性:

[assembly: InternalsVisibleTo("ACSUnitySDKTest")]

到定义“内部”类的文件顶部。此属性使得声明此属性的程序集的内部类型和成员对另一个程序集(在本例中为“ACSUnitySDKTest”程序集)可见。

问题解决了!

© www.soinside.com 2019 - 2024. All rights reserved.