为什么我会出现模棱两可的错误

时间:2014-04-11 11:22:16

标签: c# windows-8 windows-runtime windows-8.1

在Windows 8中,它运行良好。 当我将其升级到Windows 8.1时出现错误:

Error   1   The call is ambiguous between the following methods or properties: 'System.IO.WindowsRuntimeStreamExtensions.AsRandomAccessStream(System.IO.Stream)' and 'EventHandler.UI.Extensions.StreamExtensions.AsRandomAccessStream(System.IO.Stream)'...

这是我的获取错误的方法:

public BitmapImage ConvertByteArrayToBitMapImage(byte[] imageByteArray)
{
    BitmapImage bitmapImg = new BitmapImage();
    MemoryStream memStream = new MemoryStream(imageByteArray);

    var randomAccessStream = memStream.AsRandomAccessStream(); //This line has error.
    bitmapImg.SetSourceAsync(randomAccessStream);

    return bitmapImg;
}

有人可以帮助我吗?

感谢。

2 个答案:

答案 0 :(得分:2)

您可以使用完整命名空间修复问题:

  var randomAccessStream = 
     System.IO.WindowsRuntimeStreamExtensions.AsRandomAccessStream(memStream);

由于它是一种扩展方法,您可以按照代码显示的方式调用它。

答案 1 :(得分:2)

发生的事情是AsRandomAccessStream存在于范围内的多个命名空间中。编译器无法知道您指的是哪一个。您有两种选择:

  • 删除不需要的名称空间,其中包含AsRandomAccessStream
  • 指定AsRandomAccessStream <{1}}的完整路径,例如System.IO.WindowsRuntimeStreamExtensions.AsRandomAccessStream

我的猜测是,EventHandler.UI.Extensions.StreamExtensions.AsRandomAccessStream可能是由更新添加的,而System.IO.WindowsRuntimeStreamExtensions.AsRandomAccessStream是您已经使用的那个。

AsRandomAccessStream是一种扩展方法,您无法方法转换为某个命名空间。所以你不能做object.ExtensionMethod() from MyNameSpace.ExtensionMethods左右这样的事情,因为据我所知......如果它真的有可能,我想知道自己!因此,您只能像任何其他常规静态类方法一样调用此扩展方法。

小例子代码永远不会伤害:

    using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Example NewExample = new Example();
            //NewExample.DoSomething(); //Ambiguous error
            ExtensionClass1.DoSomething(NewExample); //OK
        }
    }

    public class Example
    {

    }

    public static class ExtensionClass1
    {
        public static void DoSomething(this Example A)
        {
        }
    }

    public static class ExtensionClass2
    {
        public static void DoSomething(this Example A)
        {
        }
    }
}