小编Sin*_*atr的帖子

接线员'?' 不能应用于'T'类型的操作数

试图制作Feature通用然后突然编译说

接线员'?' 不能应用于'T'类型的操作数

这是代码

public abstract class Feature<T>
{
    public T Value
    {
        get { return GetValue?.Invoke(); } // here is error
        set { SetValue?.Invoke(value); }
    }

    public Func<T> GetValue { get; set; }
    public Action<T> SetValue { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

可以使用此代码

get
{
    if (GetValue != null)
        return GetValue();
    return default(T);
}
Run Code Online (Sandbox Code Playgroud)

但我想知道如何修复那个漂亮的C#6.0单线程.

c# generics delegates c#-6.0 null-propagation-operator

23
推荐指数
2
解决办法
4811
查看次数

XAML Designer - 默认缩放?

我对VS2015中XAML Designer的默认缩放感到非常恼火(不确定版本是否相关),这是Fit all默认情况下.

有没有办法将其设置为100%默认值?禁用缩放功能也是一种选择.但有没有在VS相关Settings- XAML Designer.

PS:用语言标记它,以便像我这样的人看到,他们只看标记的问题(在我的情况下C#).

c# vb.net wpf xaml-designer visual-studio-2015

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

如何在 C# 9 中复制/克隆记录?

C#9的记录功能规范包括以下内容:

一个记录类型包含两个复制成员:

采用记录类型的单个参数的构造函数。它被称为“复制构造函数”。具有编译器保留名称的合成公共无参数实例“克隆”方法

但我似乎无法调用这两个复制成员中的任何一个:

public record R(int A);
// ...
var r2 = new R(r); // ERROR: inaccessible due to protection level
var r3 = r.Clone(); // ERROR: R does not contain a definition for Clone
Run Code Online (Sandbox Code Playgroud)

由此,我了解到构造函数是受保护的,因此无法在记录的继承层次结构之外访问。所以我们只剩下这样的代码:

var r4 = r with { };
Run Code Online (Sandbox Code Playgroud)

但是克隆呢?根据上述规范,克隆方法是公开的。但它的名字是什么?或者它是一个有效的随机字符串,因此不应在记录的继承层次结构之外调用它?如果是这样,深复制记录的正确方法是什么?从规范看来,人们可以创建自己的克隆方法。是这样吗,它应该如何工作的一个例子是什么?

c# clone copy record c#-9.0

18
推荐指数
2
解决办法
4612
查看次数

如何获得形状的内部宽度和高度

根据标题.

我正在编写一个程序,所有组件都可以根据表单的大小自动调整大小.

当我使用this.Widththis.Height属性时,它的返回值是整个表单的宽度和高度(红框).

如何获得表格内部区域(绿框)的宽度和高度?

c# forms height width

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

如何告诉XmlSerializer始终使用[DefautValue(...)]序列化属性?

我正在使用DefaultValue属性来表示正确的PropertyGrid行为(它以粗体显示与默认值不同的值).现在,如果我想使用XmlSerializer在xml文件中对没有默认值的属性的条目来序列化显示的对象.

告诉XmlSerializer序列化这些仍然是最简单的方法是什么?

我需要它来支持"版本",所以当我稍后在代码中更改默认值时 - serialized属性获取它已序列化的值,而不是"最新"的值.我可以考虑以下事项:

  • 覆盖行为PropertyGrid(使用自定义属性,因此将被忽略XmlSerializer);
  • 做一些自定义的xml序列化,忽略了DefaultValue;
  • 在传递之前对对象做一些事情,XmlSeriazer因此不再包含对象DefaultValue.

但是我有可能错过了一些秘密财产,它可以做到这一点而没有太大的痛苦= D.

这是我想要的一个例子:

    private bool _allowNegative = false;
    /// <summary>
    /// Get or set if negative results are allowed
    /// </summary>
    [Category(CategoryAnalyse)]
    [Admin]
    [TypeConverter(typeof(ConverterBoolOnOff))]
    //[DefaultValue(false)] *1
    public bool AllowNegative
    {
        get { return _allowNegative; }
        set
        {
            _allowNegative = value;
            ConfigBase.OnConfigChanged();
        }
    }
    //public void ResetAllowNegative() { _allowNegative = false; } *2
    //public bool ShouldSerializeAllowNegative() { …
Run Code Online (Sandbox Code Playgroud)

c# xml-serialization default-value winforms

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

优化LINQ Count()> X.

问题:给定IEnumerable<>,如何检查哪些序列包含多个x项目?


MCVE:

static void Main(string[] args)
{
    var test = Test().Where(o => o > 2 && o < 6); // ToList()
    if (test.Count() > 1) // how to optimize this?
        foreach (var t in test) // consumer
            Console.WriteLine(t);
}

static IEnumerable<int> Test()
{
    for (int i = 0; i < 10; i++)
        yield return i;
}
Run Code Online (Sandbox Code Playgroud)

这里的问题是什么Count()将运行完整序列和那些1E6+项目(ToList()也是坏主意).我也不被允许更改消费者代码(这是接受完整序列的方法).

c# linq

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

具有虚拟化功能的ScrollIntoView和ListView

我有ListView(默认情况下虚拟化),它ItemsSource绑定到ObservableCollection<Item>属性.

当填充数据(设置属性并且通知上升)时,我在分析器中看到2个布局峰值,第二个在调用后发生listView.ScrollIntoView().

我的理解是:

  1. ListView通过绑定加载数据ListViewItem,并从索引0开始为屏幕上的项创建.
  2. 然后我打电话listView.ScrollIntoView().
  3. 现在ListView第二次(创造ListViewItems).

如何防止去虚拟化发生两次(我之前不希望ScrollIntoView发生这种情况)?


我试着用一个repro ListBox.

XAML:

<Grid>
    <ListBox x:Name="listBox" ItemsSource="{Binding Items}">
        <ListBox.ItemContainerStyle>
            <Style TargetType="ListBoxItem">
                <Setter Property="IsSelected" Value="{Binding IsSelected}" />
            </Style>
        </ListBox.ItemContainerStyle>
    </ListBox>
    <Button Content="Fill" VerticalAlignment="Top" HorizontalAlignment="Center" Click="Button_Click" />
</Grid>
Run Code Online (Sandbox Code Playgroud)

CS:

public class NotifyPropertyChanged : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    public void OnPropertyChanged([CallerMemberName] string property = "") => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property));
}

public class ViewModel : …
Run Code Online (Sandbox Code Playgroud)

c# wpf virtualization listview mvvm

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

ListCollectionView泄漏内存吗?

我一直在研究如何避免因INotifyCollectionChanged视图模型对事件的强引用而导致的内存泄漏.我正在玩一个ListCollectionView用来查看是否会为我处理它.我认为以下是泄漏记忆,我做错了什么?

var stuff = new ObservableCollection<string>();
while (true)
{
    var result = new ListCollectionView(stuff);
    // Just to keep make sure that the memory I'm seeing 
    // isn't waiting to be GC'd
    GC.Collect(); 
}
Run Code Online (Sandbox Code Playgroud)

c# wpf memory-leaks mvvm listcollectionview

11
推荐指数
2
解决办法
2244
查看次数

WPF - 移动GridSplitter时,列无法正确隐藏

我正在尝试Grid使用GridSplitter单击按钮时隐藏列中的列(该按钮将第三列中所有项目的可见性设置为折叠).如果我不移动GridSplitter它正常工作,第三列消失,但如果我移动GridSplitter内容消失但其他列不调整大小以填充空白空间.

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition Height="25"/>
    </Grid.RowDefinitions>

    <Grid.ColumnDefinitions>
        <ColumnDefinition x:Name="a" Width="*"/>
        <ColumnDefinition x:Name="b" Width="3"/>
        <ColumnDefinition x:Name="c" Width="Auto" MaxWidth="600"/>
    </Grid.ColumnDefinitions>
    <Border Grid.Column="0" Grid.Row="0" HorizontalAlignment="Stretch" Background="Green">
        <Image Source="te/Dante.png" Height="Auto" Margin="0,128,2,71"/>
    </Border>
    <Button Grid.Column="0" Grid.Row="0" Width="30" Height="30" Margin="0,10,10,0" HorizontalAlignment="Right" VerticalAlignment="Top" Click="Button_Click"></Button>
    <GridSplitter Width="5" Grid.Column="1" Grid.Row="0" Grid.RowSpan="2" ResizeDirection="Columns" HorizontalAlignment="Left" Background="White" BorderBrush="Black" BorderThickness="1,0" ResizeBehavior="PreviousAndCurrent"/>
    <WrapPanel x:Name="wpC" Grid.Column="2" Grid.Row="0" Grid.RowSpan="2" MinWidth="300" HorizontalAlignment="Stretch" Background="Aqua" Panel.ZIndex="-1"></WrapPanel>
</Grid>
Run Code Online (Sandbox Code Playgroud)

这是我的问题的一个例子(gif):

我怎么解决这个问题?可能尊重MVVM模式.

c# wpf grid mvvm gridsplitter

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

折叠所有内容时隐藏扩展器

我有一个WPF Datagrid,它有一个Collection View Source,上面有3个级别的分组.

我已经设置了datagrid样式以使用3个扩展器,使它看起来像这样:

Level 1 Expander
<content>
    Level 2 Expander
    <content>
        Level 3 Expander
        <content>
Run Code Online (Sandbox Code Playgroud)

2级和1级只是组的标题

我有第二个控件允许用户显示和隐藏3级项目,这些项目通过将Level 3扩展器绑定到后面对象中的布尔"IsVisible"属性来工作.

       <!--  Style for groups under the top level. this is the style for how a sample is displayed  -->
        <GroupStyle>
            <GroupStyle.ContainerStyle>
                <Style TargetType="{x:Type GroupItem}">
                    <Setter Property="Margin" Value="0,0,0,0" />
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="{x:Type GroupItem}">

                                <!--  The parent control that determines whether or not an item needs to be displayed. This holds all of the sub controls displayed for a sample …
Run Code Online (Sandbox Code Playgroud)

c# wpf xaml expander

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