3

だから私はここで MSDN の例を見ていました: Constraints on Type Parameters (C# Programming Guide)whereと最初の例は、単一の具象型で制約を定義する次のジェネリック クラスを示しています。Employee

public class GenericList<T> where T : Employee

制約を使用whereする場合、> 1 型を定義するとき、または最も確実にインターフェイスを使用するときの使用を完全に理解しています。ただし (これは単なる例であることはわかっています)、なぜwhere制約を使用して 1 つの具象型に制限したいのでしょうか? 以下のコードを置き換えることはできませんでした:

public T FindFirstOccurrence(string s)

とにかく制約が1つしかないので、次のようにしますか?

public Employee FindFirstOccurrence(string s)

単一の制約を使用してコードを展開することがわかった唯一の理由はwhere、将来、if become の制約を追加できるようにするためであり、変更に対して少し簡単にセットアップできました。EmployeeIEmployee

where誰かが単一の型に制約を使用する目的を説明できますか?

ありがとう!

4

4 に答える 4

11

where 制約を使用して 1 つの具体的な型に制限する必要があるのはなぜですか?

そこにはまったく当てはまりません-制約はEmployee型とそれを継承するすべての型にあるためManagerCEOクラスにも適用できます。

制約を定義するということは、渡される型が型であるか継承型Employeeであるかにかかわらず、コード内の型でアクセス可能なメソッドを使用できることを意味します。Employee

于 2012-11-27T16:34:43.323 に答える
3

これは、流暢なインターフェイスで見られる一般的なパターンです。次のサンプルコードについて考えてみます。

public class Employee {}
public class Manager : Employee{}

public static T Method<T>(T employee) where T : Employee
{
    //do some stuff with the employee
    return employee;
}

これで、メソッドを呼び出すときに次のことができます。

Employee employee = new Employee();
employee = Method(employee);

Manager manager = new Manager();
manager = Method(manager);

Employeeの代わりにを返した場合T、この2番目のメソッド呼び出しは。を返しますEmployeeが、ここでは。を返します Manager。静的型付けを維持しながら、型のアップキャストを回避します。それが役立つ他の状況もありますが、その根底にある原則はジェネリックの一般的な使用法です。

于 2012-11-27T16:49:29.440 に答える
1

目的は、一般的な実装で使用できるメソッド/プロパティ シグネチャをコンパイラが認識できるようにすることです。

このことを考慮:

public class Employee{
     public string Name{get;set;}
     public double Salary{get;set;}
}

public class Manager : Employee{
    public List<Employee> Manages{get;set;}
}

public class PayrollList<T> : List<T> where T:Employee{
    public void SendOutPeriodPay(){
    // Note that employee.Name and .Salary are accessible 
    // even if the list is of Manager type
        this.ForEach(employee=>PaySystem.SendPay(employee.Name,employee.Salary));
  }
}
于 2012-11-27T16:44:42.333 に答える
1

タイプ T は一般的なものであり、あなたが言ったように、おそらくインターフェイスまたは基本クラスである可能性があります。これは、柔軟性やその他のものに加えて、インターフェイス/基本クラスを実装/拡張する他のクラスを挿入できることを意味します。したがって、タイプ T は実際には複数のクラスを意味する可能性があります。

ShapeT が基本クラスであるSquareRectangleしましょTriangleT。制約がある場合は、実質的に or 、、またはをT注入でき、それぞれに独自の実装があります。SquareRectangleTriangle

于 2012-11-27T16:39:24.000 に答える