c#将var声明为接口.为什么这是可能的

本文关键字:为什么 接口 var 声明 | 更新日期: 2023-09-27 18:13:08

我真的不能理解这个概念。

假设我有这个接口:

    public interface IValidate 
    {
       Dictionary<eValidationErrors, List<string>> ValidationMessages { get; }
     }

当我说:

          var Validator = control as IValidate;
          Validator.ValidationMessages.Add(key,list);

Validator是什么?为什么我可以这样使用接口?

谢谢

c#将var声明为接口.为什么这是可能的

Validator是实现IValidate接口类型的实例(如果control实例不实现IValidate接口,则为空)

如果您对某个实例的实际或精确实现不感兴趣,但如果您想使用接口提供的特性,那么这样做是很有帮助的。

想想。net框架中的一些方法,它们接受接口类型的参数。该方法对类型本身不感兴趣;它只需要确保传递的参数具有特定的方法/属性等…

as运算符将右侧转换为IValidate,因此Validator类型为IValidate

换句话说,你的代码与:

IValidate Validator = control as IValidate;

你的问题似乎是

为什么我可以这样使用接口?

但是我不明白为什么你认为这段代码会以其他方式表现。可能脱节的原因是您还不熟悉c#中var的使用。如果是这样的话,我相信快速阅读一下文档就会明白了。

可以给局部变量一个var的推断"类型",而不是一个显式的类型。var关键字指示编译器从初始化语句右侧的表达式推断变量的类型。

请注意,var变量和显式类型变量在类型安全方面没有区别。

在任何给定的时刻,Validator将不保存任何内容(空值),或者是实现IValidate的某种类型的实例,它可以被当作IValidate的实例使用。要使用一个更类似于抽象类,但涉及相同原则的示例,请考虑以下请求:

  1. 如果一辆车辆在下午6点到早上8点之间停在该位置,Tow(拖车)将对其进行检测。给我一辆新的

假设每个Vehicle都有一个Tow()方法,那么第一个请求中的Vehicle类型就足以描述该方法。另一方面,第二种方法中的Vehicle类型太模糊而无法使用。如果提供了具有相关默认参数的类型,则不必提供所需对象的绝对完整描述。例如,如果指定了ToyotaCamry,则该类型可能具有相关联的默认年份、颜色、车身样式、选项包等。另一方面,仅仅说想要一个Vehicle就太开放了。

您可以使用它作为控件对象实现IValidate。因此,使用var可以将该对象的接口部分放入Validator。

var表示类型将具有隐式类型。重要的是要理解var关键字并不意味着"变体",也不表示变量是松散类型的,或延迟绑定的。它只是意味着编译器决定并赋值最合适的类型。

所以如果你使用var Validator = control as IValidate;, Validator的类型将是IValidate

接口通常表示与对象通信的协议。因此,通过将对象强制转换为接口,您符合该协议,因此您只能调用它的公开声明的成员。