1

Delegate および OrderBy 拡張メソッドで問題が発生しています。理由を教えてください。前もって感謝します。以下はコード全体です。

namespace StudyDemo
{
    public class MyDelegate
    {
        public delegate TResult DelegateOrder<in T, out TResult>(T arg);
    }

    public class Product
    {
        public string Name { get; private set; }
        public decimal? Price { get; set; }

        public Product(string name, decimal price)
        {
            Name = name;
            Price = price;
        }

        /* private parameterless constructor for the sake of the new property-based initialization. */
        Product() { }

        public static List<Product> GetSampleProducts()
        {
            return new List<Product>
                 {
                    new Product { Name="West Side Story", Price=9.99m },
                new Product { Name="Assassins", Price=14.99m },
                new Product { Name="Frogs", Price=13.99m },
                new Product { Name="Sweeney Todd", Price=10.99m }
                 };
        }

        public override string ToString()
        {
            return string.Format("{0}: {1}", Name, Price);
        }
    }

    public partial class FrmMain : Form
    {
        public FrmMain()
        {
            InitializeComponent();
        }

        public string myOrder(Product p)
        {
            return p.Name;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            List<Product> products = Product.GetSampleProducts();

            Func<Product, string> orderDelegate2 = myOrder;
            foreach (Product product in products.OrderBy(orderDelegate2))
            {
                /* Do something */
            }

            MyDelegate.DelegateOrder<Product, string> myOrder2 = myOrder;
            foreach (Product product in products.OrderBy(myOrder2))   /*  not functioning, why? */
            {
                /* Do something */
            }
        }
    }
}

以下の注: DelegateOrderデリゲートと Func デリゲートは同じです。FuncデリゲートをDelegateOrder デリゲートにコピーするだけです。

上記のコード例では、行foreach (Product product in products.OrderBy(myOrder2)) が機能していません。誰か親切に理由を教えていただけますか?

コードをコンパイルすると、次のエラーが表示されます。

The type arguments for method 'System.Linq.Enumerable.OrderBy<TSource,TKey>(System.Collections.Generic.IEnumerable<TSource>, System.Func<TSource,TKey>)' cannot be inferred from the usage. Try specifying the type arguments explicitly.

4

2 に答える 2

3

OrderByは、Type Func のデリゲートを想定しています。あなたのデリゲートは Func 型ではないため、不平を言っています。Func と DelegateOrder は、署名が同じであっても同じではありません。デリゲート宣言は、クラス System.Delegate から派生したクラスを定義します。

于 2012-07-25T01:40:33.447 に答える
2

コンパイラには、カスタム デリゲート型 DelegateOrder を System.Func (IEnumerable.OrderBy に必要な引数) に変換する方法がありません。

これは、両方が本質的に同じ署名を持っているという事実にもかかわらずです。System.Func の使用は、同じ署名を持つデリゲート間の相互運用性を提供するため、推奨されます。

私があなただったら、インライン匿名関数を使用して順序を処理します。

foreach(Product product in products.OrderBy((Product source)=>source.Name))
{
    // Do something...
}

興味深いことに、おまけとして、デリゲート オブジェクトを使用したい場合は、次のようにします。

foreach(Product product in products.OrderBy((x)=>myOrder2(x)))
{
   // Do something...
}
于 2012-07-25T02:01:14.287 に答える