C#作业未按预期进行

C#作业未按预期进行,c#,C#,拥有一个派生自System.Windows.Forms.UserControl并实现接口IFoo的类。在使用指定的高度创建SomeControl实例并将其分配给本地IFoo变量display之后,尝试通过其公共setter为display的Height属性分配值对我来说是行不通的 我在调试过程中观察到了这一点,所以我捏造了这个测试用例来简化这件事。我意识到在我的知识中有一个缺口,为什么我不能设置这个属性,所以我想了解它是什么。谢谢 public interface IFoo { int

拥有一个派生自System.Windows.Forms.UserControl并实现接口IFoo的类。在使用指定的高度创建SomeControl实例并将其分配给本地IFoo变量display之后,尝试通过其公共setter为display的Height属性分配值对我来说是行不通的

我在调试过程中观察到了这一点,所以我捏造了这个测试用例来简化这件事。我意识到在我的知识中有一个缺口,为什么我不能设置这个属性,所以我想了解它是什么。谢谢

public interface IFoo
{
    int Height {get;set;} // which is implemented by UserControl
}

public class SomeControl : UserControl, IFoo { /*impl goes here*/ }

[TestFixture]
public class TestFixture
{
   [Test]
   public void Test()
   {
       IFoo display = ...
       // assume that display is of type SomeControl 
       // and already has a value for Height at 123

       Assert.IsTrue(display.Height == 123);
       display.Height = 789; 
       Assert.IsTrue(display.Height == 789);  //FAILS 
   }
}

实现IFoo的类型是结构还是类?如果它是一个结构,那么在创建它之后就不能更改它的属性

如果您共享某个控件的代码,这将有助于进一步诊断问题

此外,如果您可以在调试器中运行单元测试并检查值,这也会很有帮助

最后,建议编写此类测试的方法如下:

Assert.AreEqual(123, display.Height);
这将在单元测试失败时提供更好的错误报告(事实就是如此)。

C#中的接口仅仅是对任何实现者的需求的合同描述。这句话的关键是“执行”


编辑:刚刚看到您的类继承自UserControl,它已经拥有一个Height属性。要访问接口的Height属性,必须从测试中显式引用该属性。

这是因为UserControl已经定义了Height属性。要访问您的实现,您需要强制转换它

((IFoo)display).Height = 789;
这应该行得通。另外,我假设你的高度属性是明确定义的

public int IFoo.Height { get; set; }

我认为您的问题是UserControl已经有一个名为Height的属性,而IFoo也定义了Height。我认为您没有提供足够的信息来回答这个问题,但是我假设,根据您的IFoo实现,您的Height属性要么隐藏了UserControl版本的Height,要么被它隐藏了。我相信是后者,因为我记得高度是UserControl上的只读属性。

下面的代码工作正常,所以问题一定出在您的假设或您遗漏的代码中

你能发布一个简短但完整的程序,我们可以自己编译和测试吗

using NUnit.Framework;
using System.Windows.Forms;
public interface IFoo
{
    int Height { get; set; } // which is implemented by UserControl
}

public class SomeControl : UserControl, IFoo
{
    public SomeControl()
    {
        Height = 123;
    }
}

[TestFixture]
public class TestFixture
{
    [Test]
    public void Test()
   {
       IFoo display = new SomeControl();

       Assert.IsTrue(display.Height == 123);
       display.Height = 789; 
       Assert.IsTrue(display.Height == 789);
   }
}

所以,当您尝试设置Height属性时,也没有例外?对于第二个Assert语句,值仍然是123还是其他?问题:您是否添加了任何代码来自己处理Height属性,覆盖/替换UserControl的现有Height属性?用户控件是否停靠在某个对象上,以便其高度不会发生任何变化?如果您发布一个完整但简短、可编译且可执行/可测试的程序,这样我们就可以自己重现问题,这会有所帮助。请练习调试器的设置断点和单步命令。仅供参考,自动实现的属性(
blah){get;set;}
)是.Net 3.0+的一项功能。您可以使用最新的编译器使它们在2.0中工作。(Visual Studio 2008可以这样做,但Visual Studio 2005不能),或者使用语法帮助程序
断言(display.Height,Is.EqualTo(123))
。使正确的
预期值
实际值更容易使用。接口声明不会隐藏实现,因为它们不是实现,只是定义接口本身不会,但实现可能。这一切都取决于类的编写方式。例如,是否存在显式的impl接口方法的校正,还是隐式校正?