मैं एक समारोह है कि पैरामीटर के रूप में दो कार्यों लेता है के साथ काम कर रहा हूँ, और एक नया रचना एक रिटर्न:सी # कंपाइलर फ़ंक्शन हस्ताक्षर से सामान्य प्रकार के प्रतिनिधि का अनुमान क्यों नहीं लगा सकता है?
public static Action<T> Compose<T>(Action<T> first, Action second)
{
return new Action<T>(arg =>
{
first(arg);
second();
});
}
मैंने देखा है कि संकलक की शिकायत करता है, तो मैं जब यह एक भेजने, T
निर्दिष्ट नहीं करते स्थिर या सदस्य समारोह (के रूप में एक वास्तविक Action<T>
वस्तु के खिलाफ):
static void Main(string[] args)
{
// compiler error here
var composed = Compose(Test,() => Console.WriteLine(" world"));
composed("hello");
Console.ReadLine();
}
public static void Test(string arg)
{
Console.Write(arg);
}
त्रुटि संदेश:
The arguments for method 'ConsoleTest.Program.Compose(System.Action, System.Action)' cannot be inferred from the usage. Try specifying the type arguments explicitly.
मेरा प्रश्न: यहां टाइप तर्क का अनुमान क्यों नहीं लगाया जा सकता है? Test
का हस्ताक्षर संकलन समय पर जाना जाता है, है ना? क्या वास्तव में कुछ फ़ंक्शन है जो आप Test
के स्थान पर रख सकते हैं, जिससे इसके हस्ताक्षर अस्पष्ट हो जाएंगे?
पाद-टिप्पणी: मैं जानता हूँ कि मैं बस Compose
करने के लिए new Action<string>(Test)
बजाय Test
भेज सकते हैं (जैसा कि this question में बताया गया है) - मेरे सवाल "क्यों", नहीं "कैसे मैं यह कर सकता है।"
एफवाईआई - ' लिखें' इसे ठीक करता है। –
यह उत्तर देखें: http://stackoverflow.com/questions/6229131/why-cant-c-sharp-infer-type-from-this-seemingly-simple-obvious-case – lukegravitt
धन्यवाद @lukegravitt - शीर्ष जवाब वहां भाषा की कल्पना का संदर्भ देता है, और लिपर्ट खुद को झुकाता है। – McGarnagle