对两个不同的派生 类 使用相同的变量 "if is Class" 条件

Use the Same variable for "if is Class" condition for two different derived Classes

我有一个基本接口:

public interface IKlarfDefect
{
    int TEST { get; set; }
    int DEFECTID { get; set; }
}

这两个是哪位父亲类:

    public interface IKlarfDefect
{
    int TEST { get; set; }
    int DEFECTID { get; set; }

    public List<RMTKlarfImageListInfo> KlarfImageList { get; set; } = new List<RMTKlarfImageListInfo>();
}


public class CIMKlarfDefect : IKlarfDefect
{
    public int TEST { get; set; }
    public int DEFECTID { get; set; }

    public List<CIMKlarfImageListInfo> KlarfImageList { get; set; } = new List<CIMKlarfImageListInfo>();
    
}

我有一个函数遍历 IKlarfDefect 列表:

internal static string CreateDefectListString(IEnumerable<IKlarfDefect> klarfDefectList)
{
    StringBuilder defectListString = new StringBuilder();
    defectListString.AppendLine("");
    foreach (var klarfDefect in klarfDefectList)
    {    
        if ((klarfDefect is CIMKlarfDefect klarfDefectGeneric || klarfDefect is RMTKlarfDefect klarfDefectGeneric) ) 
        {
            if (klarfDefectGeneric.KlarfImageList.Count == 0)
            {
                defectListString.Append("N;");
                defectListString.AppendLine();
            }

        }
    }
    
}

但是 Visual studio 给我错误:

Severity    Code    Description Project File    Line    Suppression State
Error   CS0128  A local variable or function named 'klarfDefectGeneric' is already defined in this scope

有什么方法可以让我在 if 条件中为两种类型使用相同的变量“klarfDefectGeneric”名称?

有什么方法可以让我在 if 条件中为两种类型使用相同的变量“klarfDefectGeneric”名称?

不,没有办法专门做到这一点。

但是您可以通过创建另一个界面来获得相同的功能:

public interface IHasKlarfImageList
{
    List<Image> KlarfImageList{ get; }
}

然后继承你的两个特殊的接口类:

RMTKlarfDefect : IKlarfDefect, IHasKlarfImageList

现在您可以这样做了:

if ((klarfDefect is IHasKlarfImageList klarfDefectGeneric ) 
{
    if (klarfDefectGeneric.KlarfImageList.Count == 0)
    {
        defectListString.Append("N;");
        defectListString.AppendLine();
    }
}

请注意,如果您发现自己在做类似 if obj is type TypeA do X, else if obj is TypeB do Y 的事情,您就违反了 Open-Closed 原则并且没有正确使用多态性。这些都是大词,但这些概念并不像听起来那么吓人。请理解这些概念,以免自己(以及与您一起工作的人)头疼。多态性首先是编写接口的全部目的