在C#中是否可以使用返回类型超过1的函数?

在C#中是否可以使用返回类型超过1的函数?,c#,function,types,return,C#,Function,Types,Return,我知道函数本身不能有超过1个返回类型。我在寻找替代品 场景 我有一个类产品,其中我有各种属性。 我有一个类折扣,其中我有许多其他类(不同类型的折扣) 折扣,无论类型如何,都是对象,因为它们都有类型(百分比/固定)和值(十进制格式的价格)等。每个折扣都有一个分配给它的产品,以便系统知道对哪个产品应用此折扣规则 三种折扣类型: BasicDiscount 高级折扣 超级折扣 我有一个针对每个不同折扣的列表,以便按类型进行分组 我的目标是创建一个函数,该函数将产品作为参数,并循环检查折扣列表中的每个折

我知道函数本身不能有超过1个返回类型。我在寻找替代品

场景

我有一个类
产品
,其中我有各种属性。 我有一个类
折扣
,其中我有许多其他类(不同类型的折扣)

折扣,无论类型如何,都是对象,因为它们都有
类型
(百分比/固定)和
(十进制格式的价格)等。每个折扣都有一个分配给它的产品,以便系统知道对哪个产品应用此折扣规则

三种折扣类型:

BasicDiscount
高级折扣
超级折扣

我有一个针对每个不同折扣的
列表
,以便按类型进行分组

我的目标是创建一个函数,该函数将
产品
作为参数,并循环检查折扣列表中的每个折扣,以检查该产品是否存在。如果找到该对象,我希望函数返回该对象,无论它是
基本折扣
高级折扣
超级折扣
等(列出的折扣类型将是折扣类中的折扣类型)

这是我目前所处位置的一个例子

假设
产品X
应用了
BasicDiscount

function object getDiscount(Product p){

    (UnknownType) discount;

     foreach (BasicDiscount b in BasicDiscounts)
                    if (b.Product.ID == p.ID)
                       discount = b;
     foreach (AdvancedDiscount ad in AdvancedDiscounts)
                    if (ad.Product.ID == p.ID)
                       discount = ad;
     foreach (SuperDiscount sd in SuperDiscounts)
                    if (sd.Product.ID == p.ID)
                       discount = sd;

     return discount;
}

既然我不知道该产品可以享受哪种类型的折扣,我怎么才能退回正确的折扣呢

还是有别的办法

TLDR;-如果您必须创建一个必须返回名称或年龄(数据类型为int或string)的函数,但您不知道将选择哪一个,那么您的函数将是什么返回类型

非常感谢您的帮助,谢谢!:)

接口! 您可以使用每个折扣类实现的接口,然后只需将接口返回给调用方法

例如


您能否创建一个所有类型折扣共享的界面,并将您的方法标记为返回它?或者一个基类。同时回答TLDR:您不会首先创建这样的方法,至少在C#这样的静态类型语言中是这样。如果没有类型检查,处理返回值是不可能的,这从设计的角度来看是非常糟糕的。这是一个TLDR,我需要一个简单的逻辑答案,但我理解你的意思是一开始就不会出现这种情况。你可以使用带有
out
参数的方法这似乎是合理的。但我认为如果我想访问三种折扣类型之间不常见的属性,这是不可能的?您可以将接口转换为调用类中的具体类型:
var basicDiscount=discount as basicDiscount
。您还可以检查接口的具体类型:
if(折扣是BasicDiscount)
您必须向上转换为实际类型。
public interface IDiscount
{
    // method or property signatures
}

public class BasicDiscount : IDiscount
{
    // implementation of interface members
}

public IDiscount getDiscount(Product p)
{
     (IDiscount) discount;

     foreach (BasicDiscount b in BasicDiscounts)
         if (b.Product.ID == p.ID)
             discount = b;
     foreach (AdvancedDiscount ad in AdvancedDiscounts)
         if (ad.Product.ID == p.ID)
             discount = ad;
     foreach (SuperDiscount sd in SuperDiscounts)
         if (sd.Product.ID == p.ID)
             discount = sd;

     return discount;
}