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;