小编Ben*_*dgi的帖子

无法通过委托

我创建了一个从用户获取控制台输入的功能,只要它适合过滤器即可.

public delegate TResult OutFunc<in T, TValue, out TResult>(T arg1, out TValue arg2);

public static T PromptForInput<T>(string prompt, OutFunc<string, T, bool> filter)
{
    T value;
    do { Console.Write(prompt); }
    while (!filter(Console.ReadLine(), out value));
    return value;
}
Run Code Online (Sandbox Code Playgroud)

当我像下面这样调用方法时,这很有效.只要它解析到int(0-10)范围内的数字,它就从用户那里得到一个数字.

int num = PromptForInput("Please input an integer: ",
    delegate(string st, out int result)
    { return int.TryParse(st, out result) && result <= 10 && result >= 0; } );
Run Code Online (Sandbox Code Playgroud)

我希望能够重复使用常见的过滤器.在我的程序中的多个地方,我想int从用户那里得到一个输入,所以我已经分离了它的逻辑,并把它放在它自己的函数中.

private bool IntFilter(string st, out int result)
{
    return int.TryParse(st, …
Run Code Online (Sandbox Code Playgroud)

.net c# delegates anonymous-function

3
推荐指数
1
解决办法
143
查看次数

为什么编译器不能从使用中推断出这种类型的参数

这个问题是基于我的另一个SO问题的结果.我的新问题不是我如何让X工作的问题,而是为什么X不起作用.

我已经创建了一个简单的问题示例,但是如果你想看到我正在使用它的实际应用/情况,请查看我原来的问题(下面的函数实际上并没有做任何有用的事情).

T bar<T>(Func<T, bool> f) { return default(T); }
bool foo(int i) { return true; }
Run Code Online (Sandbox Code Playgroud)

现在我有3行代码可以按预期工作,并且所有目的都是明智的.

int num;
num = bar<int>(foo);
num = bar(new Func<int, bool>(foo));
num = bar((int i) => true );
Run Code Online (Sandbox Code Playgroud)

我的问题是:"为什么我需要明确指定Tbar第一个例子吗?" 我不知道这是因为编译器将前两个示例转换为相同的代码行.使用ILSpy我看到代码编译成这个.

num = Program.bar<int>(new Func<int, bool>(Program.foo));
num = Program.bar<int>(new Func<int, bool>(Program.foo));
num = Program.bar<int>((int i) => true);
Run Code Online (Sandbox Code Playgroud)

我不明白为什么编译器不能从我只有一个名为foo的函数来推断类型,并且它确实适合模板.现在,如果我创建了另一个函数,bool foo(bool i)我会理解,如果编译器抱怨存在一些歧义,并且它不知道我想要哪一个,并且我应该明确指定类型参数.

这当然只是我的懒惰,但它只是我期待的东西,当编译器没有恢复我的松弛时感到惊讶.

.net c# compiler-construction delegates anonymous-function

3
推荐指数
1
解决办法
274
查看次数

WPF中的异步任务

我试图为WPF UI Code Behind运行任务.但它不起作用,并在我使用时注意到 Task.Factory它,但是当我使用代码时它没有用Task.Factory

public MainWindow()
{
    InitializeComponent();

    GetNews();
}

private void GetNews()
{
    Task.Factory.StartNew(() =>
    {
        FeedReader reader = new FeedReader();
        var news = reader.RetrieveFeed("http://www.bbc.com/feed/");
        foreach (var item in news)
        {
            textBlock.Text = item.Title;
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

我如何使用async/await或任何阻止阻塞主线程的东西?

.net c# wpf asynchronous

2
推荐指数
1
解决办法
4242
查看次数

在函数中动态创建或设置函数的返回类型

我试图创建一个函数,其中返回类型在运行时确定.我知道我可以返回一个object或者dynamic,但是我的目标是让object返回的类型,并被编译器和InteliSense识别.

我知道我可以object在退回之后再投我,这将是最容易实现的,但这不是编程精神.

这是我正在尝试创建的一个示例

注意:我实际上并不想要Buttons和Grids ......这只是用于这个例子.

Type T;
public T Question(bool aBool)
{
    if (aBool)
    {
        T = typeof(Button);
        return new Button();
    }
    else
    {
        T = typeof(Grid);
        return new Grid();
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,这显然不起作用,我理解为什么.但是我想知道是否有人有办法可行,或者当C#的当前状态无法实现.

编辑:对评论的回应......我理解这看起来像"神奇",我明白编译器必须弄清楚我的结果是什么才能起作用.编译器/ Intellisense/Visual Studio已经为许多其他事情做了这件事.虽然这些事情很简单,例如检测无法访问的代码或绘制视觉预览.我很好奇这是否是一个实现的功能.

c# generics types

1
推荐指数
1
解决办法
461
查看次数

ClassName <T ="">的含义和方法

在查看Microsoft 的Tuple类的实现时,我看到了许多我不理解的代码行.

我已经阅读了MSDN文档中关于泛型的所有内容,我从未见过T="",当我尝试用这种语法编译代码时,它失败了.我想知道它的目的是什么,如果没有微软的个人C#编译器就可以使用它.我也很好奇这个代码的差异t1T1,我可能是错的但它看起来不像是可行的代码,即使没有奇怪="".

在这里,我用其他可能相关的代码粘贴了我的问题的一个例子.

public static class Tuple
{
    //Other Create(....) Methods

    public static Tuple<t1, t2=""> Create<t1, t2="">(T1 item1, T2 item2) 
    {
        return new Tuple<t1, t2="">(item1, item2);
    }

    //Other Create(....) Methods
}

[Serializable]
public class Tuple<t1, t2=""> : IStructuralEquatable, IStructuralComparable, IComparable, ITuple
{
    private readonly T1 m_Item1;
    private readonly T2 m_Item2;
  
    public T1 Item1 { get { return m_Item1; } }
    public T2 Item2 { get { return m_Item2; } …
Run Code Online (Sandbox Code Playgroud)

c# generics types

1
推荐指数
1
解决办法
141
查看次数