相关疑难解决方法(0)

覆盖获取,但未设置

我有一个定义a的抽象类get,但不是set,因为就抽象类而言,它只需要一个get.

public abstract BaseClass
{
  public abstract double MyPop
  {get;}
}
Run Code Online (Sandbox Code Playgroud)

但是,在某些派生类中,我需要一个set属性,所以我正在研究这个实现

public class DClass: BaseClass
{
  public override double MyPop
  {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

问题是,我有一个编译错误,说

*.set:无法覆盖,因为*.没有可覆盖的set访问器.

即使我认为上述语法完全合法.

有什么想法吗?解决方法,或者为什么会这样?

编辑:我能想到的唯一方法是将两个getsetas放在抽象类中,让子类抛出一个NotImplementedExceptionif set被调用而且没有必要.这是我不喜欢的东西,还有一个特殊的setter方法.

c#

75
推荐指数
5
解决办法
5万
查看次数

在基类构造函数中设置时,为什么重写的只用属性保持为null?

我尝试了以下示例:

public class TestBase
{
    public virtual string ReadOnly { get; }

    public TestBase()
    {
        ReadOnly = "from base";
    }
}

class Test : TestBase
{
    public override string ReadOnly { get; }
    public Test()
    {
        // nothing here
    }
}
Run Code Online (Sandbox Code Playgroud)

当我创建一个Test实例时,我看到ReadOnly保持为null.但为什么?我真的不明白它,有人可以向我解释为什么会这样吗?至少我会期望和错误,只能在拥有类之外设置只读属性.

c# automatic-properties

45
推荐指数
2
解决办法
1874
查看次数

为什么我们不能在覆盖C#中的方法时更改访问修饰符?

在C#中,我们无法在从基类重写方法时更改访问修饰符.例如

Class Base
{
   **protected** string foo()
   {
       return "Base";
   }
}

Class Derived : Base
{
   **public** override string foo()
   {
       return "Derived";
   }
}
Run Code Online (Sandbox Code Playgroud)

这在C#中无效,会产生编译时错误.

我想知道原因,为什么不允许这样做.是否存在任何技术问题,或者是否会导致访问限制方面不一致的问题?

c# oop access-modifiers

44
推荐指数
2
解决办法
2万
查看次数

在C#中将setter添加到虚拟属性

我有这样的情况:

public abstract class BaseClass 
{
   public abstract string MyProp { get; }
}
Run Code Online (Sandbox Code Playgroud)

现在,对于某些派生类,属性值是一个合成值,因此没有setter:

public class Derived1 : BaseClass
{
    public override string MyProp { get { return "no backing store"; } }
}
Run Code Online (Sandbox Code Playgroud)

这很好用.但是,某些派生类需要更传统的后备存储.但是,无论我如何编写它,如在自动属性上,或使用显式的后备存储,我都会收到错误:

public class Derived2 : BaseClass
{
    public override string MyProp { get; private set;}
}

public class Derived3 : BaseClass
{
    private string myProp;
    public override string MyProp 
    { 
        get { return myProp;} 
        private set { myProp = value;}
    }
}
Run Code Online (Sandbox Code Playgroud)

Derived2.MyProp.set':无法覆盖,因为'BaseClass.MyProp'没有可覆盖的set访问器

我如何让它工作?

.net c# properties automatic-properties

9
推荐指数
1
解决办法
1万
查看次数

如何使用C#中的setter覆盖getter-only属性?

更新: 此问题已经过修改,以使其更加清晰.下面的答案似乎反映出这种方法效果很好.希望这个问题可以帮助那些需要添加get或者添加set现有财产的人.


今天遇到一个问题,我需要get用a get和覆盖基类的-only属性set.目前的共识似乎是这是不可能的,但我认为我找到了一种方法.

一般的想法是创建一个new属性而不是直接override使用旧属性,然后我们通过调用新方法创建一个overrideget方法的桥接方法.

情况

这是一些无法修改的任意预先存在的类型结构的代码.

public abstract class A
{
    public abstract int X { get; }
}
public class B : A
{
    public override int X { get { return 0; } }
}
Run Code Online (Sandbox Code Playgroud)

问题

我们想编写这段代码,但不会编译.

public class C : B    // won't compile: X can't have a 'set' method
{
    private int _x;
    public override int X …
Run Code Online (Sandbox Code Playgroud)

c# getter setter overriding readonly

7
推荐指数
1
解决办法
5089
查看次数

C#Indexer属性 - 虚拟化get而不是set方法的任何方法?

我有一种特殊的字典.我不确定如何准确地执行此操作,但我希望将get方法设为虚拟,而不是set方法:

    public TValue this[TKey key]
    {
        get { ... }
        set { ... }
    }
Run Code Online (Sandbox Code Playgroud)

是否可能,如果是,那么正确的组合是什么?

c# virtual dictionary indexer properties

6
推荐指数
2
解决办法
4528
查看次数

DataSource更改之前的DataGridView事件

有没有我可以在DataGridView中触发DataSourceChanging事件.DataGridView具有DataSourceChanged事件(我相信)在DataSource绑定到DataGridView之后.我希望在属性改变之前做一些事情.

我的示例代码......

private void LoadGrid()
{
    //  I do some things like saving user settings here
    DtgRefundAssign.DataSource = BLL.GetDataSource(parameter1, parameter2); //Just to illustrate
    //  And restore them after the datasource is bound

}
Run Code Online (Sandbox Code Playgroud)

我需要以多种形式做类似的事情.只要数据源发生变化,只需考虑开发一个通用程序即可完成此任务.恢复部分可以使用DataSourceChanged事件完成...但是我应该处理哪个事件来执行保存部分?

.net c# datagridview

3
推荐指数
1
解决办法
2161
查看次数