c#将var声明为接口。为什么会这样?
我不能真正理解这个概念 假设我有这个接口:c#将var声明为接口。为什么会这样?,c#,interface,C#,Interface,我不能真正理解这个概念 假设我有这个接口: public interface IValidate { Dictionary<eValidationErrors, List<string>> ValidationMessages { get; } } 什么是验证器?为什么我可以这样使用接口 谢谢验证程序是实现IValidate接口的类型的实例(如果控件实例没有实现IValidate接口,则为null) 如果您对某个实例的实际或精确
public interface IValidate
{
Dictionary<eValidationErrors, List<string>> ValidationMessages { get; }
}
什么是验证器?为什么我可以这样使用接口
谢谢
验证程序
是实现IValidate
接口的类型的实例(如果控件
实例没有实现IValidate
接口,则为null)
如果您对某个实例的实际或精确实现不感兴趣,但希望使用该接口提供的功能,那么这样做是有帮助的
考虑一下.NET framework本身中的一些方法,它们采用接口类型的参数。方法对类型本身不感兴趣;只需要确保传递的参数具有某些方法/属性等。。。由指定接口声明。as运算符将右侧转换为
IValidate
,因此验证器
被键入为IValidate
换句话说,您的代码与以下代码相同:
IValidate Validator = control as IValidate;
你的问题似乎是
为什么我可以这样使用接口
但是我不明白为什么你认为这个代码会有其他的表现。可能是因为您还不熟悉C#中var
的用法。如果是这样的话,我相信快速阅读这篇文章会让一切变得清晰
可以为局部变量指定一个推断的“类型”var,而不是显式类型。var关键字指示编译器从初始化语句右侧的表达式推断变量的类型
请注意,
var
变量和显式类型变量之间的类型安全性没有区别。您可以将其用作控制对象实现IValidate。因此,使用var可以将该对象的接口部分放入验证器。var
意味着类型将具有隐式类型。重要的是要理解var关键字并不表示“variant”,也不表示变量是松散类型的,或者是后期绑定的。这只意味着编译器确定并分配最合适的类型
因此,如果您使用
var Validator=control作为IValidate代码>验证程序的类型将是IValidate。接口通常表示与对象通信的协议。因此,将对象强制转换到接口时,您符合该协议,因此您只能调用其公开声明的成员。在任何给定时刻,要么验证程序将不持有任何内容(空值),要么是实现IValidate的某个类型的实例,可以将其用作IValidate的实例。要使用一个更类似于抽象类的例子,但涉及到相同的原则,请考虑以下请求:
如果车辆在下午6点到上午8点之间停在该区域,则牵引它。
给我买辆新车。
如果每辆车都有Tow()方法,则第一个请求中的车辆类型具有足够的描述性,可以执行该方法。另一方面,第二种方法中的车辆类型过于模糊,无法使用。如果提供了具有关联默认参数的类型,则不必提供所需对象的绝对完整的描述。例如,如果一辆指定的丰田汽车,该类型可能有一个相关的默认年份、颜色、车身样式、选项包等。另一方面,仅仅说想要一辆车就太开放了。在visual studio IDE中悬停在var
上也会告诉您这一点。
IValidate Validator = control as IValidate;