2010-12-02 21 views
11

Özellikle, bunu yazmak istiyorum:Genel bir anonim yöntem nasıl yazabilirim?

public Func<IList<T>, T> SelectElement = list => list.First(); 

Ama T bir sözdizimi hatası alıyorum. Genel bir anonim yönteme sahip olamaz mıyım?

+0

çözüldü! http://stackoverflow.com/questions/4338867 – mpen

cevap

11

Hayır, üzgünüm. Bu, C# destekleyen özellikleri olmayan genel alanlar veya genel özellikler gerektirir. Yapabileceğiniz en iyi T tanıtır genel bir yöntem yapmak geçerli:

public Func<IList<T>, T> SelectionMethod<T>() { return list => list.First(); } 

Ve şimdi söyleyebiliriz:

Func<IList<int>, int> selectInts = SelectionMethod<int>(); 
5
yapabilirsiniz Tabii

ancak T bilinmelidir:

public Func<IList<T>, T> SelectionMethod<T>() 
{ 
    return list => list.First(); 
} 
: Eğer jenerik içeren sınıf yapmak istemiyorsanız, bir generic yöntemi kullanabilirsiniz Alternatif olarak

class Foo<T> 
{ 
    public Func<IList<T>, T> SelectionMethod = list => list.First(); 
} 

Ama hala derleme zamanında birisinin bu T'u bilmesi gerekecek.

+0

Evet, sorun bu. T'nin ne olduğunu bilmiyorum. Bir char veya bir dize olabilir. – mpen

+0

Peki, umarım, “Foo ” sınıfındaki tüketici (bunu başlatan), bunu bilecektir. Eğer derleme zamanında bunu hiç bilmiyorsanız, jenerikler sizin için doğru yapı değildir. –

+2

Peki, yönteminiz veya sınıfınız, 'T' jenerik parametresini almalıdır. – cdhowie

1

Yalnızca dönüş türünü genel olarak bildirdiniz.

bu deneyin:

public Func<IList<T>, T> SelectionMethod<T>() { return list => list.First(); } 

bunu bir genel olması için tip parametrelerini içermelidir bildiriyorlar şeyin adı. Derleyici, yalnızca genel sınıfları ve genel yöntemleri destekler.

Yani, genel bir sınıf için size yöntemlere

için,

class MyGeneric<T> { 
    // You can use T here now 
    public T MyField; 
} 

sahip Ya gerekir

public T MyGenericMethod<T>(/* Parameters */) { return T; } 
ilk yöntem adına ilan edildi ancak eğer, dönüş parametresi olarak T kullanabilirsiniz

.

Geri dönüş türü gerçek yöntemden önce bildirilmiş gibi görünse bile, derleyici bu şekilde okumaz.

+0

Eh? Hayır, düzenleme yapmadan önce yapmadım. Ve bunun bir şeyle ne ilgisi var? – mpen

+0

Bu daha iyi bir açıklama. Ben genel bir lambda istedim, ki sanırım mevcut değil. – mpen

0
public static void SomeContainerFunction() 
    { 
     const string NULL_VALUE = (string)null; 

     Type GetValueType<T>(T value) => value?.GetType() ?? typeof(T); 

     var typeOfNullValue = GetValueType(NULL_VALUE); 

     Debug.WriteLine($"Value: {NULL_VALUE}, Type: {typeOfNullValue}"); 
    } 
+1

SO'ya hoş geldiniz. Bir soruya cevap verirken lütfen kodunuzla ilişkili açıklama sağlayın. Bazı kişiler kodunuzu anlayamayabilir veya soruyu nasıl yanıtladığını görmeyebilir. [İyi bir cevap nasıl yazılır] bölümüne bakın (https://stackoverflow.com/help/how-to-answer) – Nuageux

İlgili konular