具有显式调用的C#构造函数歧义-错误CS0012

尤夫

C#中存在无法解释的歧义,在此我明确尝试调用构造函数,但编译器认为它是不同的构造函数。我将首先展示我们使用的简短C#体系结构。然后显示我创建的一个小“工作”示例,以及可能的解决方案,但我仍然想理解为什么会发生这种情况。

架构:

在此处输入图片说明

  1. 桥接C ++ API的CLR DLL。
  2. 使用桥接级别的C#API。
  3. 使用C#API的C#客户端应用程序。
  • 请注意,不允许C#客户端使用CLR级别。

我创建的示例

CLR DLL中的类:

#pragma once

#include <string>

using namespace System;

namespace Inner {
    public ref class AInner
    {
    public:

        AInner() : _data(new std::wstring(L"")) {}

        ~AInner() {
            delete _data;
        }

        property String^ Val
        {
            String^ get()
            {
                return gcnew String((*_data).data());
            }

            void set(String^ value) {
                System::IntPtr pVal = System::Runtime::InteropServices::Marshal::StringToHGlobalUni(value);
                *_data = (const wchar_t*)pVal.ToPointer();
                System::Runtime::InteropServices::Marshal::FreeHGlobal(pVal);
            }
        }

    private:

        std::wstring* _data;
    };
}

在DLL中包装CLR级别的类:

using System;

using Inner;

namespace Outer
{
    public class A
    {
        public A()
        {
            _inner.Val = String.Empty;
        }

        public A(string val)
        {
            init(val);
        }

        public string Val
        {
            get
            {
                return _inner.Val;
            }
            set
            {
                _inner.Val = value;
            }
        }

        internal A(AInner inner)
        {
            _inner = inner;
        }

        private void init(string Val)
        {
            _inner = new AInner();
            _inner.Val = String.Empty;
        }

        private AInner _inner;
    }
}

请注意,有一个internal构造函数和一个public构造函数。

使用C#API DLL的可执行客户端:

using Outer;

namespace OneClient
{
    class Program
    {
        static void Main(string[] args)
        {
            string myString = "Some String";
            A testA = new A(myString);
        }
    }
}

故事的转折点:

在包装CLR级别的DLL中,外部客户端不应使用所有API,而内部客户端可以使用所有API,因此,通过添加[assembly: InternalsVisibleTo("OneClient")]到包裹CLR的DLL的'AssemblyInfo.cs',内部组件可以暴露给内部客户端水平。

问题

编译客户端代码时,出现以下错误: error CS0012: The type 'AInner' is defined in an assembly that is not referenced. You must add a reference to assembly 'InnerOne, Version=1.0.7600.28169, Culture=neutral, PublicKeyToken=null'.

  1. 我无法使用,InnerOne因为不允许客户端使用此级别。
  2. 客户端暴露在两个A(string val)A(AInner inner)构造。

可能的解决方法:

  1. 删除[assembly: InternalsVisibleTo("OneClient")]-由于特定客户端需要使用其他内部类,因此这是不可接受的。
  2. A(string val)构造函数更改A(string val, bool unique=true)并使用它A testA = new A(myString, true)-不是一个好的解决方案。
  3. 使用默认的构造函数A()并调用testA.Val = myString;-这实际上可以,但是需要很多代码。
  4. 将客户端代码从更改A testA = new A(myString)A testA = new A(val:myString);-这实际上是选择的解决方案。

为什么会发生这种歧义?

  • 我称其为A(string val)myString实际上是一个string值,这很奇怪。

这是Microsoft编译器中的错误吗?

示例源:源代码One.zip

约翰娜森·巴克莱

为什么会发生这种歧义?

因为要满足构造函数的重载分辨率,所以编译器需要知道所有参数类型是什么,并且它不知道anAInner什么

为什么不将AInner版本公开为工厂方法:

static internal A Create(AInner inner)
{
    return new A { _inner = inner };
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

构造函数可访问性C#编译器错误CS0122与CS1729

来自分类Dev

具有显式构造函数的不可复制类型的C ++ 11数组初始化

来自分类Dev

移动构造函数(错误:调用隐式删除的拷贝构造函数)

来自分类Dev

错误:调用“ Cadena”的隐式删除副本构造函数

来自分类Dev

Java错误:隐式超级构造函数未定义。必须显式调用另一个构造函数

来自分类Dev

我的一段代码试图读取doc / docx文件。调用WordExtractor构造函数会产生歧义错误

来自分类Dev

ASP.NET Core 5.0错误CS0012:类型'Object'在程序集'mscorlib中定义

来自分类Dev

C#中的显式构造函数调用

来自分类Dev

显式副本构造函数编译错误

来自分类Dev

模板函数调用歧义错误

来自分类Dev

C ++隐式和显式继承构造函数调用

来自分类Dev

C#:具有相同名称和不同签名的多个函数,但是编译器调用了错误的函数。如何解决?

来自分类Dev

显式删除永不使用的复制构造函数会产生编译错误

来自分类Dev

错误:构造函数必须显式初始化引用成员

来自分类Dev

使用C#代码生成问题-CS0012-IsLongModifier

来自分类Dev

为什么空的lambda和具有显式返回的构造函数会导致编译器错误(Java Bug?)

来自分类Dev

调用重载的构造函数会产生歧义错误C ++

来自分类Dev

错误:构造函数必须显式初始化引用成员

来自分类Dev

存在具有默认参数的构造函数时,c ++构造函数中的歧义

来自分类Dev

调用函数错误:类的显式实例

来自分类Dev

构造函数可访问性C#编译器错误CS0122与CS1729

来自分类Dev

Java错误:隐式超级构造函数未定义。必须显式调用另一个构造函数

来自分类Dev

具有默认构造函数的VPTR与显式声明的构造函数

来自分类Dev

具有所有默认参数的显式构造函数不能从同一类的另一个构造函数调用

来自分类Dev

显式删除永不使用的复制构造函数会产生编译错误

来自分类Dev

使用C#代码生成问题-CS0012-IsLongModifier

来自分类Dev

CS0012 C#类型'HttpContext'在未引用的程序集中定义

来自分类Dev

显式强制调用构造函数?

来自分类Dev

CS0012 您必须添加对程序集 Windows 的引用,版本 255,255,255,255 WindowsRuntime

Related 相关文章

  1. 1

    构造函数可访问性C#编译器错误CS0122与CS1729

  2. 2

    具有显式构造函数的不可复制类型的C ++ 11数组初始化

  3. 3

    移动构造函数(错误:调用隐式删除的拷贝构造函数)

  4. 4

    错误:调用“ Cadena”的隐式删除副本构造函数

  5. 5

    Java错误:隐式超级构造函数未定义。必须显式调用另一个构造函数

  6. 6

    我的一段代码试图读取doc / docx文件。调用WordExtractor构造函数会产生歧义错误

  7. 7

    ASP.NET Core 5.0错误CS0012:类型'Object'在程序集'mscorlib中定义

  8. 8

    C#中的显式构造函数调用

  9. 9

    显式副本构造函数编译错误

  10. 10

    模板函数调用歧义错误

  11. 11

    C ++隐式和显式继承构造函数调用

  12. 12

    C#:具有相同名称和不同签名的多个函数,但是编译器调用了错误的函数。如何解决?

  13. 13

    显式删除永不使用的复制构造函数会产生编译错误

  14. 14

    错误:构造函数必须显式初始化引用成员

  15. 15

    使用C#代码生成问题-CS0012-IsLongModifier

  16. 16

    为什么空的lambda和具有显式返回的构造函数会导致编译器错误(Java Bug?)

  17. 17

    调用重载的构造函数会产生歧义错误C ++

  18. 18

    错误:构造函数必须显式初始化引用成员

  19. 19

    存在具有默认参数的构造函数时,c ++构造函数中的歧义

  20. 20

    调用函数错误:类的显式实例

  21. 21

    构造函数可访问性C#编译器错误CS0122与CS1729

  22. 22

    Java错误:隐式超级构造函数未定义。必须显式调用另一个构造函数

  23. 23

    具有默认构造函数的VPTR与显式声明的构造函数

  24. 24

    具有所有默认参数的显式构造函数不能从同一类的另一个构造函数调用

  25. 25

    显式删除永不使用的复制构造函数会产生编译错误

  26. 26

    使用C#代码生成问题-CS0012-IsLongModifier

  27. 27

    CS0012 C#类型'HttpContext'在未引用的程序集中定义

  28. 28

    显式强制调用构造函数?

  29. 29

    CS0012 您必须添加对程序集 Windows 的引用,版本 255,255,255,255 WindowsRuntime

热门标签

归档