我可以用什么来定义一个与class同名的C#属性?

MB.*_*MB. 8 .net c#

我正在使用C#来创建一个将广泛分发的.Net类库(DLL).我有一个名为的抽象类Value,我希望它有一个double也称为Valueie 的抽象属性

public abstract class Value {

    // Only accessible by subclasses within the project.
    internal Value() {}

    public abstract double Value {
        get;
    }

}
Run Code Online (Sandbox Code Playgroud)

但C#编译器不会允许这样-我得到的消息"成员名称不能与它们的封闭类型",作为讨论在这里.

我知道最简单的事情就是更改属性的名称或类的名称......但实际上我希望这些名称是这样的,我很高兴实现一个丑陋的黑客来获取就这样.只要它从使用此DLL的外部代码正常工作即可.

与C#不同,VB.Net 允许我定义一个与类同名的属性,所以我目前正在研究将我的C#项目与一个VB项目合并,该项目定义了一个Value类(及其Value属性)来制作一个DLL.这似乎并不像我希望的那么简单.

另一种选择是在VB中重写整个项目...不是很吸引人,但如果有必要,我会考虑它.我更喜欢C#而不是VB.Net,但我的首要任务是以我想要的方式获取构建的DLL.

我想知道其他可能的选择.有什么想法可以解决这个问题吗?

编辑:从下面的评论中可以清楚地看到,很多人并不认为课堂上的"价值"这个名字太多了......难道有人会解释为什么这么糟糕吗?我知道它不是很具描述性,但我认为它非常适合我的项目.是因为它是C#中的一个关键字,用于属性设置器吗?

Mar*_*ell 8

你不能直接这样做.但是,您可以考虑:

  • 阻止与Value成员的接口,并使用显式接口实现(调用者将使用接口,但)
  • 在类中重命名它,并使用扩展方法来公开Value()方法,所以obj.Value()工作
  • 在类中重命名它,但Value在子类中公开它

丑陋的黑客:

public abstract class ValueBase {
    public abstract double Value { get; }
    internal ValueBase() {}
}
public abstract class Value : ValueBase {
    internal Value() {}
}
public sealed class ValueReal : Value {
    public override double Value { get { return 123; } }
}
Run Code Online (Sandbox Code Playgroud)

  • 不,它是为那些确实想要实现该接口的人准备的,出于某种奇怪的原因。如果他们实现了接口(即使我不希望他们这样做),我就无法在不破坏他们的代码的情况下向接口添加另一个方法。引用《框架设计指南》第 88 页:“接口的主要缺点是,在允许 API 发展方面,接口的灵活性比类低得多。发布接口后,其成员集将永远固定...课程提供了更大的灵活性...” (2认同)