gpt4 book ai didi

C#: "Cannot create an instance of the static class"

转载 作者:搜寻专家 更新时间:2023-11-01 01:01:40 25 4
gpt4 key购买 nike

我在将一些 Java 代码转换为 C# 的过程中偶然发现了以下奇怪的事情:

public interface IActivation {
public abstract double func(double inputput);

public static class S1 : IActivation {
public double func(double input) {
if (input > 0) return 1.0;
return 0.0;
}
}
}

SomewhereElse(用法):

protected IActivation activation = new IActivation.S1();

看原始代码,很清楚这是什么用意:

  1. 声明一个接口(interface)并在其中嵌套该接口(interface)的多个静态实现(代码包含 IActivation 的其他实现,例如“S2”、“S3”等,此处省略)。
  2. 典型的使用场景是为该接口(interface)的一个特定实现分配一个变量。此外,顺便说一下,您需要实例化该变量,这些特定实现属于何处是非常清楚的——从某种意义上说,嵌套声明将进一步提高代码的可读性(例如 new IActivation.S1(); 明确表示 S1 是 IActivation 的特定实现)。

有趣的是,C# 不喜欢整个事物的定义方式:“无法创建静态类‘IActivation.S1”的实例。有谁知道如何重构该代码以保留 1. 和 2. 的方法?

最佳答案

在 Java 中,static 内部类无法隐式访问其封闭类型的成员。在 C# 中,所有 嵌套类型都无法访问其父类型的成员;您无需在 C# 中添加修饰符即可触发此行为。

在 C# 中,static 类是abstract sealed,因此它们既不能创建也不能派生——这与 Java 中的含义不同。此外,接口(interface)不能包含它们自己的类型声明。

尝试这样的事情:

public interface IActivation {
double Func(double inputput);
}

public class S1 : IActivation {
public static readonly S1 Instance = new S1();

private S1() { }

public double Func(double input) {
if (input > 0) return 1.0;
return 0.0;
}
}

如果您的目标是以某种“可读”的方式提供默认实现(尽管我质疑 IActivator.S1() 本质上更具可读性......)那么您可以创建一个静态工厂类:

public static class Activator
{
public static S1 S1
{
get
{
return S1.Instance;

// Or you could do this if you make the S1 constructor public:
// return new S1();
}
}
}

但是,我对这更具可读性或帮助性的说法提出异议。在特定类型的上下文中构造对象时,Visual Studio 将显示该类型的所有子类型。所以如果你这样做(| 代表光标):

IActivator foo = new |

您应该获得当前范围内实现 IActivotor 的所有类的简洁列表。

关于C#: "Cannot create an instance of the static class",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7146707/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com