0

C# 言語で 2 つのパラメーターを取り、2 つ以上の値を返す Max という名前のジェネリック メソッドを記述します。参照型のみをサポートするように制約を適用します。int 型のプロパティとして給与を持つ Employee クラスに対してテストします。Max は、給与に基づいて 2 つの従業員インスタンスを比較し、より高い給与を持つ従業員インスタンスを返す必要があります。これは私が行ったことです。

using System;  
using System.Collections.Generic;   
using System.Text;  

namespace Generic_Max_of_Salary
{
    class Program   
    {
        static void Main(string[] args)
        {
            runtest();                
        }

        public static void runtest()    
        {
            Test_Maximum(new Employee { Salary = 10000 }, new Employee { Salary = 20000 }, new Employee { Salary = 20000 }, 1);
            Test_Maximum(new Employee { Salary = 30000 }, new Employee { Salary = 20000 }, new Employee { Salary = 30000 }, 2);
            Test_Maximum(new Employee { Salary = 10000 }, new Employee { Salary = 10000 }, new Employee { Salary = 10000 }, 3);    
        }

        public static void Test_Maximum(Employee emp1, Employee emp2, Employee obtained_answer, int testcase)
        {
            Employee expected_answer = Maximum<Employee>(emp1, emp2);

            if (CompareTo(obtained_answer, expected_answer))
            {
                Console.WriteLine("Test " + testcase + " Passed");
            }
            else
            {
                Console.WriteLine("Test " + testcase + " Failed");
            }
        }

        public static T Maximum<T>(T emp1, T emp2)
        {

            if (emp1.Salary >= emp2.Salary)
            {
                return emp1;
            }
            else
            {
                return emp2;
            }
        }

        public static bool CompareTo(Employee obtained_answer, Employee expected_answer)
        {
            if (obtained_answer.Salary == expected_answer.Salary)
            {
                return true;
            }
            else
            {
                return false;
            }
        }            
    }

    class Employee
    {
        public int Salary { get; set; }    
    }
}
4

1 に答える 1

1

Tこれは、オープン型に というプロパティがあることをコンパイラが認識していないためSalaryです。T派生クラスにする必要があるという制約を追加するか、従業員インスタンスの代わりに給与を使用しEmployeeて関数を呼び出す必要があります。Maximum

public static T Maximum<T>(T emp1, T emp2) where T: Employee
{
    if (emp1.Salary >= emp2.Salary)
    {
        return emp1;
    }
    else
    {
        return emp2;
    }
}

質問を詳しく説明すると、次のような参照型のみを制約する汎用関数

static T Maximum<T>(T obj1, T obj2) where T : class
{
    if (obj1 > obj2)
    {
        return obj1;
    }

    return obj2;
}

>で演算子が定義されていないため、 は機能しませんT。あなたの最善のチャンスは、入力オブジェクトがIComparableorであるかどうかを確認することですEmployees:

static T Maximum<T>(T obj1, T obj2) where T : class
{
    if (obj1 is Employee && obj2 is Employee)
    {
        if (((Employee)obj1).Salary > ((Employee)obj2).Salary)
        {
            return obj1;
        }

        return obj2;
    }

    if (obj1 is IComparable && obj2 is IComparable)
    {
        if (((IComparable)obj1).CompareTo(obj2) > 0)
        {
            return obj1;
        }

        return obj2;
    }

    throw new NotSupportedException("Cannot compare two reference types without knowledge of the type.");
}
于 2013-08-13T07:49:51.013 に答える