返回一个与声明的结构不同的结构,为什么它是正确的? C#

时间:2014-11-17 14:24:37

标签: c#

我正在读这段代码:

private static WaveFormat WaveFormatFromBlob(Blob blob){
 if(blob.Length == 40)
    return (WaveFormatExtensible)Marshal.PtrToStructure(blob.Data, typeof(WaveFormatExtensible));                
 return (WaveFormat)Marshal.PtrToStructure(blob.Data, typeof (WaveFormat));
}

如果将returnvalue声明为WaveFormat,我该如何返回WaveFormatExtensible?接下来的问题是:如何在调用例程中区分返回给我的类型并选择相应的赋值?我需要在一个或另一个中更改参数,具体取决于它的类型。我知道这是基本的c#,但我只是不明白。

3 个答案:

答案 0 :(得分:1)

我认为代码的结构基本上是这样的

public class WaveFormatExtensible  : WaveFormat
{
   ...
}

这意味着从返回基类WaveFormat的方法返回扩展对象WaveFormatExtended,通过上面的方法将其转换为WaveFormat

答案 1 :(得分:1)

documentation说(强调我的):

  

WAVEFORMATEXTENSIBLE结构定义了波形音频数据的格式,该格式具有超过两个通道或更高的样本分辨率,而不是WAVEFORMATEX允许的格式。 它还可以用于定义WAVEFORMATEX可以定义的任何格式。

因此C ++中的两个结构之间存在一些兼容性。 (实际上Format的{​​{1}}是WAVEFORMATEXTENSIBLE)。

我想从C ++到C#的映射将其实现为派生的 ,这意味着WAVEFORMATEX扩展了WaveFormatExtensible。如果是这样,WaveFormat的实例是WaveFormatExtensible的有效返回类型。

答案 2 :(得分:1)

根据thisWaveFormatExtensibleWaveFormat的子类型:

public class WaveFormatExtensible : WaveFormat

那么,你所看到的是Liskov Substitution Principle

  

可替代性是面向对象编程的一个原则。它   说明,在计算机程序中,如果 S(WaveFormatExtensible) T(WaveFormat)的子类型,那么   类型为T的对象可以用S 对象替换(即,   类型S的对象可以替换类型为T)的对象而不改变   该程序的任何理想属性(正确性,任务   表演等。)。

由于WaveFormatExtensible派生自WaveFormat,因此它有资格作为该方法的返回类型。