以下是关于C#协方差的代码片段.我对如何应用协方差有一些了解,但有一些我很难掌握的详细技术内容.
using System;
namespace CovarianceExample
{
interface IExtract<out T> { T Extract(); }
class SampleClass<T> : IExtract<T>
{
private T data;
public SampleClass(T data) {this.data = data;} //ctor
public T Extract() // Implementing interface
{
Console.WriteLine
("The type where the executing method is declared:\n{0}",
this.GetType() );
return this.data;
}
}
class CovarianceExampleProgram
{
static void Main(string[] args)
{
SampleClass<string> sampleClassOfString = new SampleClass<string>("This is a string");
IExtract<Object> iExtract = sampleClassOfString;
// IExtract<object>.Extract() mapes to IExtract<string>.Extract()?
object obj = …Run Code Online (Sandbox Code Playgroud) C#5.0语言规范7.6.10.2 对象初始化器声明
在等号后面指定对象初始值设定项的成员初始值设定项是嵌套对象初始值设定项,即嵌入对象的初始化.而不是为字段或属性分配新值,嵌套对象初始值设定项中的赋值被视为对字段或属性成员的赋值.嵌套对象初始值设定项不能应用于具有值类型的属性,也不能应用于具有值类型的 只读字段.
虽然我理解在构造函数运行后初始化程序无法修改只读字段,但我没有关于属性限制的线索.
以下是我用于测试此属性限制的代码示例:
using System;
namespace ObjectCollectionInitializerExample
{
struct MemberStruct
{
public int field1;
public double field2;
}
class ContainingClass
{
int field;
MemberStruct ms;
public int Field
{
get { return field; }
set { field = value; }
}
public MemberStruct MS
{
get { return ms; }
set { ms = value; }
}
}
class Program
{
static void Main(string[] args)
{
// Nested object initializer applied to a …Run Code Online (Sandbox Code Playgroud) 我对C#中控件应用程序事件的理解:
创建一个与订阅者类中的事件处理程序方法具有相同签名的委托.
声明基于此委托的事件
提升事件
我对这一步的理解是:它只是一个包装函数,其中参数被传递给事件以调用事件指向的事件处理函数.
因此,引发事件只是调用发布类中的包装函数.
现在,当我创建一个非常简单的Windows窗体应用程序时,我无法应用这个一般概念.
只需一个按钮即可考虑使用WinForms应用程序.
// registering statement
Button1.Click += new EventHandler (this.button1_click)
Run Code Online (Sandbox Code Playgroud)
我可以确定第一步.它是预定义的System.EventHandler委托.
按钮的单击事件也是预定义的.没问题.
事件提升步骤:此处我无法在控制台应用程序和Windows应用程序之间建立连接.
代码保存在哪里实际上为WinForms应用程序提升事件?我们似乎不必编码.
我理解当有人"点击"按钮时会引发click事件,但是如何在WinForms应用程序的C#代码中实现?
编译器"只是"知道按钮的Click事件是指有人点击某个按钮,因此应该引发一个事件?
如何提出点击事件?参数如何传递给事件?