Есть ли возможность указать для делегата несколько типов возврата?

Так чтобы например в такой ситуации заменить object на int|double|string: первый и второй примеры кода.

    private Dictionary<string, Func<int[], object>> Funcs2 = new Dictionary<string, Func<int[], object>>{
        {"min2sum", (nums) => nums.OrderBy(n => n).Take(2).Sum()},
        {"max3average", (nums) => nums.OrderByDescending(n => n).Take(3).Average()},
        {"arrToString", (nums) => nums.ToString()}
        };
    private Dictionary<string, Func<int[], int|double|string>> Funcs2 = new Dictionary<string, Func<int[], int|double|string>>{};

Ответы (1 шт):

Автор решения: Blackmeser

Не совсем понятен контекст того, что вы хотите сделать.
Если прямо отвечать, то нет, нельзя так указать.
Из существующих инструментов вы можете использовать object, но с ним могут быть проблемы при проверке содержащегося типа.
Ещё вариант - вы можете возвращать кортеж (int? intval, double? dval, string strval)
Пример: Func<int[], (int? intval, double? dval, string strval)>

Ещё лучше, если вы опишите свой класс/структуру с 3мя полями нужных вам типов данных и enum-полем, указывающим на то, какой тип сейчас используется, например:

//совершенно без проблем может быть и структурой  
class MyDataContainerIntDoubleString
{
    public CurrentDataTypeIntDoubleString CurrentDataType { get; set; } = CurrentDataTypeIntDoubleString.Undefined;
    public int IntVal { get; set; }
    public int DoubleVal { get; set; }
    public int StringVal { get; set; }

    public enum CurrentDataTypeIntDoubleString
    {
        Undefined = 0,
        Int = 1,
        Double = 2,
        String = 3
    }
}

... и будуте передавать его, например: Func<int[], MyDataContainerIntDoubleString>

→ Ссылка