显式实现带有可选参数的接口的警告

问题描述 投票:0回答:3

我正在使用可选参数来看看它们如何与接口一起工作,我遇到了一个奇怪的警告。 我的设置是以下代码:

 public interface ITestInterface
 {
     void TestOptional(int a = 5, int b = 10, object c = null);
 }

 public class TestClass : ITestInterface
 {

     void ITestInterface.TestOptional(int a = 5, int b = 5, object c = null)
     {
        Console.Write("a=" + a + " b=" + b + " c=" + c);
     }
 }

编译器给我以下警告:

  • 为参数“a”指定的默认值将无效,因为它适用于在不允许可选参数的上下文中使用的成员
  • 为参数“b”指定的默认值将无效,因为它适用于在不允许可选参数的上下文中使用的成员
  • 为参数“c”指定的默认值将无效,因为它适用于在不允许可选参数的上下文中使用的成员

如果我使用以下代码运行它:

class Program
{
    static void Main(string[] args)
    {
        ITestInterface test = new TestClass();
        test.TestOptional();
        Console.ReadLine();
    }
}

我得到了“

a=5 b=10 c=
”的输出,正如我所期望的那样。

我的问题是警告的目的是什么? 它指的是哪些上下文?

c# c#-4.0 compiler-warnings optional-parameters
3个回答
33
投票

C# 中可选参数的问题是被调用者将对象视为

TestClass
还是
ITestInterface
。在第一种情况下,应用类中声明的值。在第二种情况下,应用接口中声明的值。这是因为编译器使用静态可用的类型信息来构造调用。在显式接口实现的情况下,永远不会“为类”调用该方法,而总是“为接口”调用

10.6.1 中的 C# 语言规范指出:

如果可选参数出现在实现部分方法声明(第 10.2.7 节)、显式接口成员实现(第 13.4.1 节)或单参数索引器声明(第 10.9 节)中,编译器应发出警告,因为这些永远不能以允许省略参数的方式调用成员。


28
投票

编译器告诉你

void ITestInterface.TestOptional(int a = 5, int b = 5, object c = null)

基本相同
void ITestInterface.TestOptional(int a, int b, object c)

原因是,由于您必须通过接口调用 TestOptional,因此接口将提供参数。在课堂上不可能没有为您提供参数值。

2024 编辑: 您可以使用接口中的 C# 8 默认实现来实现您的预期结果

interface ILogger
{
    void Log(LogLevel level, string message);
    void Log(Exception ex) => Log(LogLevel.Error, ex.ToString());
}

您可以轻松地执行类似以下操作:

public interface ITestInterface
{
     void TestOptional(int a, int b, object c);
     
     void TestOptional() => TestOptional(5);
     void TestOptional(int a) => TestOptional(a, 10);
     void TestOptional(int a, int b) => TestOptional(a, b, null);
     
}

4
投票

克雷格,

这些警告来自类方法实现中指定的默认值。在 .net 中,参数的默认值始终由引用类型确定。当然,使用这样的显式接口实现,只能通过接口引用调用此方法 - 它定义了默认值。因此,你在课堂上放什么值当然无关紧要,因为它永远不会被解决,你可以愉快地删除它。智能感知就可以了,因为这里的默认值永远不会有效。

http://funcakes.posterous.com/?tag=c

http://funcakes.posterous.com/c-40-optional-parameters-default-values-and-i

© www.soinside.com 2019 - 2024. All rights reserved.