【问题标题】:C# constructor overload + explicit cast = .dll reference missingC# 构造函数重载 + 显式转换 = 缺少 .dll 引用
【发布时间】:2012-09-14 09:07:58
【问题描述】:

简化的类如下。每个命名空间都在单独的 .cproj 中。构建 z.exe 时出现“B 在未引用的程序集中定义”的问题。

我添加了 ctor A(string s),因为我不想在每个 z 中都包含 y.dll(我有很多 z)。如何使这项工作没有混乱?

一种方法是在 A(B b) 或 A(string s) 中添加另一个参数,以便它们具有不同数量的参数,但这对我来说并不好。

    //namespace x
    using y;
    public class A
    {
        public A(string s)
        public A(B b)
    }

    //namespace y
    public class B
    {
        public static explicit operator B(string s)
    }

    //namesapce z
    using x;
    public class C
    {
        void M()
        {
            string s = "";
            A(s);
        }
    }

【问题讨论】:

  • 你试过部分类吗?
  • @elyashiv 不确定部分课程有什么帮助。你能解释一下你的想法吗?
  • A 声明为部分,并在y.dll 中声明declare A(B b)
  • @elyashiv,您不能使用分部类将类的实现拆分到多个程序集中。仅跨编译为同一程序集的多个源文件。

标签: c# .net casting constructor overloading


【解决方案1】:

我知道实现这一点的唯一方法是使第二个 A 构造函数内部化:

//namespace x     
public class A     
{         
    public A(string s)         
    internal A(B b)     
}

如果您有其他程序集需要使用此构造函数;你可以考虑使用InternalsVisibleTo 属性。

【讨论】:

  • 这是一个不错的技巧,不知道这是可能的。我只需要看看我有多少朋友,然后决定对于那些不是我朋友的人来说,这个参数是更好的还是虚拟的;)
  • @watbywbarif,是的,最好将它限制在少数几个亲密的朋友中 :) 如果您有更多的朋友,您可能需要重新考虑您的设计 - 可能将 B 移到同一个程序集中作为A。
【解决方案2】:

为什么不从 A 派生另一个类,然后隐藏不需要的构造函数?

public class ADerived : A
{
    public ADerived(string s) : base (s)
    {
    }
}

然后使用命名空间/程序集 z 中的ADerived

【讨论】:

  • 这是肯定的一种方式,但是因为我会有很多 A 也是不切实际的。
【解决方案3】:

您的 A 类引用 B(作为构造函数参数),因此任何使用 A 类的东西也需要知道 B 类才能构建。

顺便说一句,为了构建您的代码,在 A 类声明之前缺少一个 using y;

【讨论】:

  • 当构造函数有不同数量的参数时不正确。试过了,z 中不需要对 B 的引用。感谢您使用你!
  • 对,在这种情况下确实可以构建~
  • 如果它还可以使用具有默认值的额外虚拟参数构建,那就太酷了,但这不起作用;(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-23
  • 1970-01-01
  • 2013-11-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多