c# - 编译器匹配 where 子句排除它的扩展
问题描述
给定以下代码:
using System;
using Microsoft.Extensions.Logging;
namespace CompileError
{
public interface IMessage
{
string UniqueId { get; }
}
public class Message : IMessage
{
public Message(string uniqueId)
{
this.UniqueId = uniqueId;
}
public string UniqueId { get; }
}
public static partial class IMessageExtensions
{
public static void LogInformation<TMessage>(this TMessage message, string information)
where TMessage : IMessage
{
Console.WriteLine($"[{message.UniqueId}] {information}");
}
}
public static partial class ILoggerExtensions
{
public static void LogMessage<TMessage>(this ILogger logger, TMessage message)
where TMessage : IMessage
{
// This line does not compile
logger.LogInformation($"[{message.UniqueId}]");
// But this one does
logger.LogInformation($"[{message.UniqueId}]", 42);
// At least, there's a workaround:
LoggerExtensions.LogInformation(logger, $"[{message.UniqueId}]");
}
}
}
编译器在第一次调用LogInformation
in时失败LogMessage
,因为它认为我正在调用TMessage.LogInformation
上面定义的调用,而不是LoggerExtensions.LogInformation
从 MS 包调用。
我认为该where
子句足以告诉编译器不要使用此扩展。显然,有一些解决方法,如图所示。我还可以确保它们不共享命名空间,并且从 中看不到错误LogInformation
的命名空间LogMessage
,但我很惊讶 C# 编译器无法解决这个问题。漏洞?
解决方案
推荐阅读
- wordpress - 我如何将 reactjs 文件排入 wordpress 主题文件以使其在本地服务器中可见
- c# - 如何从 ASP.Net 中重复页脚行中的 DataTable 多列总计中求和
- python - 如何修复 bs4 选择错误:'TypeError: __init__() 关键字必须是字符串'
- c# - 如何对私有方法进行单元测试?
- angular - 具有未定义结果长度的角材料表分页器
- python-3.x - 在 for 循环中返回多行
- spring-boot - 如何让 Spring Boot 的自动重启在 IntelliJ IDEA 社区中工作?(out/build 目录问题)
- sql - 没有为此带有 SQL Server 的 DbContext .NET Core 配置数据库提供程序
- html - Bootstrap 4 全屏图像
- dart - 如何创建带有 2 个小部件的 Listtile 前导?