【问题标题】:Why do I get ambiguous error为什么我会收到模棱两可的错误
【发布时间】:2014-04-11 19:42:05
【问题描述】:

在 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;
}

有人可以帮我吗?

谢谢。

【问题讨论】:

  • 删除方法的 using 语句之一并使用完整签名
  • EventHandler.UI.Extensions.StreamExtensions 命名空间是什么?
  • 或者使用AsRandomAccessStream 的完整命名空间,而不是像System.IO.WindowsRuntimeStreamExtensions.AsRandomAccessStream。我假设这个函数在更新之前就存在于 UI.Extensions 命名空间中。
  • 考虑删除文件顶部的using 指令(不是语句)using System.IO;using EventHandler.UI.Extensions;。如果你的类的命名空间是相关的,可以取决于你是否有 usings 外部或内部 namespace 声明,但我认为它在这里不相关,因为在这种情况下不会有歧义(扩展之一会有更高的“优先级”)。

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


【解决方案1】:

您可以使用完整的命名空间来解决您的问题:

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

因为它是一个扩展方法,你可以按照代码显示的方式调用它。

【讨论】:

    【解决方案2】:

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

    • 删除你不需要的同时包含AsRandomAccessStream的命名空间
    • 指定AsRandomAccessStream 的完整路径,如System.IO.WindowsRuntimeStreamExtensions.AsRandomAccessStream

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

    AsRandomAccessStream 是一个扩展方法,你不能cast一个方法到某个命名空间。所以你不能做像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)
            {
            }
        }
    }
    

    【讨论】:

    • (到最后一段)两个扩展方法都扩展同一个类System.IO.Stream,所以当持有这些方法的类都在范围内时,无法指定使用哪个扩展。当然,如果他们扩展了不同的类型,那么((SpecialStream)memStream).AsRandomAccessStream() 可能是明确的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-05
    • 2018-03-02
    • 1970-01-01
    • 2020-11-05
    • 2018-06-22
    • 2020-01-12
    • 2016-01-01
    相关资源
    最近更新 更多