小编Dee*_*ena的帖子

试着去理解?C#中的(null-conditional)运算符

我有一个非常简单的例子:

class Program
{
    class A
    {
        public bool B;
    }

    static void Main()
    {
        System.Collections.ArrayList list = null;

        if (list?.Count > 0)
        {
            System.Console.WriteLine("Contains elements");
        }

        A a = null;

        if (a?.B)
        {
            System.Console.WriteLine("Is initialized");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

if (list?.Count > 0)编译完美,这意味着如果listnull,表达式Count > 0变为false默认.

但是,该行if (a?.B)抛出编译器错误,表示我无法隐式转换bool?bool.

为什么一个人与另一个人不同?

c# nullable roslyn c#-6.0 null-conditional-operator

62
推荐指数
2
解决办法
5760
查看次数

泛型方法签名和标准签名相同

假设您有一个使用T的方法的类.您还有相同名称的标准方法.

如果T与标准方法的类型相同,会发生什么?调用标准方法.

有什么方法可以强迫他打电话给T法吗?

使用系统;

namespace ConsoleApplication3
{
class Program
{
    static void Main()
    {
        Generics<Int32> anInt = new Generics<Int32>(4);
        Generics<String> aString = new Generics<String>("test");
    }
}

public class Generics<T>
{
    public T Member;

    public String ErrorMessage;

    public Generics(T member)
    {
        this.Member = member;
    }

    public Generics(String errorMessage)
    {
        this.ErrorMessage = errorMessage;
    }
}
}
Run Code Online (Sandbox Code Playgroud)

c# generics overloading

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

属性:内部获取、保护集

我有一个本身是内部的类,因此声明中的以下差异没有实际后果,但我想了解其背后的机制。

我有一个这样的财产:

public String CreditedAs { get; protected set; }
Run Code Online (Sandbox Code Playgroud)

它编译得很好。getter 可以被任何有权访问该类的人读取,setter 只能在该类或由该类派生的类中读取。

现在当我尝试这个时:

internal String CreditedAs { get; protected set; }
Run Code Online (Sandbox Code Playgroud)

我明白了

The accessibility modifier of the '{class}.CreditedAs.set' accessor
must be more restrictive than the property or indexer '{class}.CreditedAs'
Run Code Online (Sandbox Code Playgroud)

这是为什么?和

protected String CreditedAs { internal get; set; }
Run Code Online (Sandbox Code Playgroud)

也不行。

c# properties

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

MVVM:代码隐藏的邪恶还是务实的?

想象一下,你想要一个Save & CloseCancel & Close你的花式WPF MVVM窗口上的按钮?

你会怎么做?MVVM规定你将按钮绑定到ICommand控制器的反转并指示你View可能知道你的ViewModel但不是相反.

我在网上找到了一个解决方案,它有一个ViewModel结束事件,View订阅如下:

private void OnLoaded(Object sender
    , RoutedEventArgs e)
{
    IFilterViewModel viewModel = (IFilterViewModel)DataContext;
    viewModel.Closing += OnViewModelClosing;
}

private void OnViewModelClosing(Object sender
    , EventArgs<Result> e)
{
    IFilterViewModel viewModel = (IFilterViewModel)DataContext;
    viewModel.Closing -= OnViewModelClosing;
    DialogResult = (e.Value == Result.OK) ? true : false;
    Close();
}
Run Code Online (Sandbox Code Playgroud)

但是这与我迄今为止设计良好的MVVM混合在一起.

另一个问题是在显示主窗口时显示许可问题消息框.我可以再次使用Window.Loaded像我上面那样的事件,但这也打破了MVVM,不是吗?

在这些情况下,是否有一种干净的方式或者应该是实用的而不是迂腐的?

c# data-binding wpf code-behind mvvm

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

INNER JOIN中的子查询(MySQL)

我似乎在内连接中有一个子查询有问题,但是我没有.

  • 服务器:通过UNIX套接字的Localhost
  • 软件:MySQL
  • 软件版本:5.5.32-nmm2-log - (Ubuntu)
  • 数据库客户端版本:libmysql - 5.5.32

有一个m:n表构造,有3个表,其中只有2个与问题相关.

  • 第一个是包含actor的表,标识符:caid.
  • 第二个是跨表连接演员到电影(演员ID:caid,电影ID:id)

当我像这样创建一个完整的内部联接:

SELECT count( * ) AS Count, lastname, firstname
FROM DVDPROFILER_dvd_common_actor
INNER JOIN DVDPROFILER_dvd_actor ON DVDPROFILER_dvd_common_actor.caid = DVDPROFILER_dvd_actor.caid
WHERE DVDPROFILER_dvd_actor.caid > 0
GROUP BY DVDPROFILER_dvd_actor.caid
ORDER BY Count DESC 
Run Code Online (Sandbox Code Playgroud)

我得到的正是我所期待的:顶级演员按照他在任何电影中记入的时间计算,即使多次担任多个角色也是如此.

我的目标是提取有关演员被分析的电影的数量的信息,我认为 - 我很天真 - 它应该像这样简单:

SELECT count( * ) AS Count, lastname, firstname
FROM DVDPROFILER_dvd_common_actor
INNER JOIN
  (SELECT caid
  FROM DVDPROFILER_dvd_actor
  GROUP BY id) AS DVDPROFILER_dvd_actor 
ON DVDPROFILER_dvd_common_actor.caid = DVDPROFILER_dvd_actor.caid
WHERE DVDPROFILER_dvd_actor.caid > 0
GROUP BY …
Run Code Online (Sandbox Code Playgroud)

mysql inner-join subquery

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

VS 2015:如何“记住”TFS路径?

在 VS 2010 中,源代码管理资源管理器只会记住您上次选择的 TFS 树,并再次跳转相同的分支和子文件夹。

VS 2015 总是从根节点开始,你每次都必须烦人地导航到你的工作分支。

有没有办法让它像2010年那样记住路径?

tfs visual-studio-2010 visual-studio-2015

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

如何使列表框水平滚动

我有一个包含长字符串的列表框.

开头并不是所有与用户相关的,这就是为什么我想让列表框自动以编程方式向右滚动.

您可以垂直滚动到最后一项,但我还没有找到模拟用户滚动到右侧的方法.

有任何想法吗?

c# listbox winforms

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

比较两个空的nullables

C#5.0规范在第7.1.3章中介绍

https://msdn.microsoft.com/en-us/library/ms228593.aspx

false如果一个或两个操作数都是,则提升的运算符产生值null.

但是测试也是这个MSDN链接

http://msdn.microsoft.com/en-us/library/2cf62fcy(v=vs.100).aspx

int? num1 = 10;
int? num2 = null;

// Change the value of num1, so that both num1 and num2 are null.
num1 = null;
if (num1 == num2)
{
  // The equality comparison returns true when both operands are null.
  Console.WriteLine("num1 == num2 returns true when the value of each is null");
}

/* Output:
 * num1 == num2 returns true when the value of each is null
 */ …
Run Code Online (Sandbox Code Playgroud)

c# nullable lifted-operators

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

C#如果== false,为什么执行&= SomeFunction()?

让我们说你有

class Program
{
    static void Main()
    {
        bool a = GetFalse();
        if (a)
        {
            a = GetTrue();
        }

        bool b = GetFalse();
        b &= GetTrue();
    }

    static bool GetFalse() => (false);

    static bool GetTrue() => (true);
}
Run Code Online (Sandbox Code Playgroud)

为什么GetTrue()b已经错误的情况下执行?

&=操作员是否应该认识到它永远不能评估为真?

c# boolean-logic boolean-operations

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