C# 8.0 默认接口实现基本语法/显式调用

2024-01-04

我一直在搞乱默认的接口实现。认为您必须向下转换为接口类型才能使用默认方法实现。我还发现了一堆关于另一种语法的注释,我找不到这是否已经包含在内,我确实找到了关于它的外观的“决定”,但是它不起作用。我做错了吗?还是这个新语法尚未包含在内?

有些相关但没有回答我的问题:从实现结构中调用 C# 接口默认方法而不进行装箱 https://stackoverflow.com/questions/57827493/calling-c-sharp-interface-default-method-from-implementing-struct-without-boxing

注释base<>/base()句法:https://github.com/dotnet/csharplang/blob/master/meetings/2018/LDM-2018-11-14.md#default-interface-implementations https://github.com/dotnet/csharplang/blob/master/meetings/2018/LDM-2018-11-14.md#default-interface-implementations

微软关于该提案的页面:https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-8.0/default-interface-methods https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-8.0/default-interface-methods

class D : IA, IB, IC
{
                  //Notice the use of base() right here.
    void IA.M() { base(IB).M(); }
}

假设我们需要对某个对象进行 INotifyPropertyChanged。我们现在可以在接口上默认实现 SetField :

public interface INotify : INotifyPropertyChanged
{
    void InvokePropertyChanged(string propertyName);

    bool SetField<T>(ref T field, T value, [CallerMemberName] string propertyName = null)
    {
        INotify thing = (INotify)this;

        if (propertyName == null)
        {
            throw new ArgumentException($"{nameof(propertyName)} is null. PropertyChangedEventHandler will not be fired correctly.");
        }

        if (EqualityComparer<T>.Default.Equals(field, value)) return false;
        field = value;
        InvokePropertyChanged(propertyName);
        return true;
    }
}

实现它需要沮丧(((INotify)this).SetField), 使用base(INotify)会优先选择这里。

public class Thing : INotify
{
    public string A
    {
        get => _a;
        //Need an explicit cast here. Can't figure out how to use base syntax.
        set => ((INotify)this).SetField(ref _a, value);
    }
    private string _a;

    public event PropertyChangedEventHandler PropertyChanged;

    public void InvokePropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 8.0 默认接口实现基本语法/显式调用 的相关文章

随机推荐

  • 转换行结尾[重复]

    这个问题在这里已经有答案了 我一直在使用d2u转换行结尾 安装 Puppy Linux 后 我注意到它没有附带d2u but dos2unix 然后我注意到 Ubuntu 默认情况下缺少这两者 转换行结尾的另一种方法是什么 一些选项 Usi
  • *it++ 对于输出迭代器如何有效?

    在示例代码中 我经常看到这样的代码 it 用于输出迭代器 表达方式 it 复制一份it 增量it 然后返回最终取消引用的副本 据我了解 制作输出迭代器的副本会使源无效 但随后增量为it创建副本后执行的操作是非法的 对吗 我对输出迭代器的理解
  • 悬停时增加文本大小

    所以这是我的问题 On hover 我想要字体大小增加 但我想要黑色容器保持一致像之前一样 正如您可能通过示例了解的那样 黑色容器也在增加 这个问题如何在悬停时仅增加文本框中文本的字体大小 https stackoverflow com q
  • 获取元视口标签以在桌面上工作

    我创建了一个在桌面上启用元视口标签的脚本 但是我似乎无法从视口标签获取指定的宽度 我目前有这个 var viewportcontent myviewport attr content var viewportcontents viewpor
  • 属性错误:“对象没有属性”

    我有一个问题 我正在使用 python 3 编写代码 该代码是将网站的新闻发布到我的画布上 但是我不断收到此错误 其中显示 AttributeError NewsFeed 对象没有属性 canvas 这是我的代码 from tkinter
  • 查询将行数据显示为列

    我需要一个查询来执行行记录作为列 例如 行保存数据为 101 102 103 104 结果应该是 101 102 103 104 你可以检查切换sql中的行和列 http www simple talk com sql t sql prog
  • 如何高效生成Zipf分布数?

    我目前正在对 C 中的一些数据结构进行基准测试 我想在处理 Zipf 分布式数字时测试它们 我正在使用此网站上提供的生成器 http www cse usf edu christen tools toolpage html http www
  • 在c中交换两个结构

    您好 我正在尝试创建一个交换函数来交换结构的前两个元素 有人可以告诉我如何进行这项工作吗 void swap struct StudentRecord A struct StudentRecord B struct StudentRecor
  • 在 VSCode 中关闭提交消息文件时,Git 挂起并显示“提示:正在等待编辑器关闭文件...”

    我在跑git commit amend在 VSCode 终端中 它会在 VSCode 编辑器窗口中以文件形式弹出提交消息 并且 git 会说 在终端中 hint Waiting for your editor to close the fi
  • 有没有办法自定义ViewPager滚动的阈值?

    我无法找到更改 ViewPager 中滚动页面的触摸阈值的方法 http developer android com reference android support v4 view ViewPager html http develop
  • 获取上次重新启动时间[重复]

    这个问题在这里已经有答案了 可能的重复 显示构建日期 https stackoverflow com questions 1600962 displaying the build date 如何知道 Windows 何时启动或关闭 http
  • 声明全局静态变量

    我正在尝试在 Visual Studio 中设置全局变量 但无法将其设为静态 有什么方法可以让我将变量设置为静态并在不同的方法之间共享它 或者有什么方法可以在每次更改时保存变量 您有两个选择 1 创建一个包含共享变量的类 这与 C 中的静态
  • 摆脱新 Android 上的旧应用程序图标

    前段时间我做了一个简单的 Android 应用程序 一个上传数据的共享意图处理程序 现在我为它设计了一个新的 SVG 图标 以矢量图形导入到项目中 然后使用 InkScape 转换为一系列 PNG 并替换项目中的所有 PNG 该应用程序现在
  • 使用 SparkSession 或 sqlcontext 时出错

    我是火花新手 我只是想使用sparksession 或sqlcontext 解析json 文件 但每当我运行它们时 我都会收到以下错误 Exception in thread main java lang NoSuchMethodError
  • 无法在 /usr/bin 内部创建符号链接,即使使用 sudo [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 当我尝试对 usr bin 文件夹中的二进制文件进行符号链接时 出现 操作不允许 错误 sudo ln s usr bin python2
  • 在两个进程之间交换大量数据的最有效方法是什么?

    最近我正在为一个软件构建DVR http en wikipedia org wiki Digital video recorder 它将安装在插入了 2 个或更多 PCIE x4 视频编码器卡的 x86 PC 服务器上 我们有两个独立的进程
  • 单击标签时阻止 select2 打开

    这个问题演变成了阻止按下回车键时打开下拉菜单 正如你所看到的 我丑陋的解决方案用一个关闭下拉菜单setTimeout当标签输入具有焦点时按 Enter 键 如何防止它在输入时完全打开 而不是在打开后关闭它 以下是一些可能有用的事件 http
  • 顶部“xterm”:未知终端类型

    运行 TOP 命令时出现错误 gt top xterm unknown terminal type gt echo TERM xterm gt echo DISPLAY DYSPLAY Undefined variable gt cat e
  • 当 HTML5 搜索输入可见时,嵌入的 YouTube 视频无法在 iPad (iOS 7) 上播放

    这是一个错误 我已经设法通过暴力修复 但我不明白为什么该解决方案有效 问题在于 嵌入式 YouTube 视频无法在 iPad 在 iOS7 中测试 的横向视图中的特定 响应式 网站上运行 我设法将其范围缩小到一个特定的 CSS 规则 当浏览
  • C# 8.0 默认接口实现基本语法/显式调用

    我一直在搞乱默认的接口实现 认为您必须向下转换为接口类型才能使用默认方法实现 我还发现了一堆关于另一种语法的注释 我找不到这是否已经包含在内 我确实找到了关于它的外观的 决定 但是它不起作用 我做错了吗 还是这个新语法尚未包含在内 有些相关