我正在为枚举类型定义的扩展方法编写单元测试。这是一个测试
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#编译器看不到扩展方法了。扩展方法类 AudioStreamSampleRateEx 上的访问修饰符 internal 阻止此类,从而阻止测试类 AudioStreamSampleRateExTests 中访问扩展方法。
为了修复它,我添加了这个属性:
[assembly: InternalsVisibleTo("ACSUnitySDKTest")]
到定义“内部”类的文件顶部。此属性使声明此属性的程序集的内部类型和成员对另一个程序集(在本例中为“ACSUnitySDKTest”程序集)可见。
问题解决了!