C# 我的扩展方法不起作用

C# 我的扩展方法不起作用,c#,interface,extension-methods,C#,Interface,Extension Methods,我正在构建一个单位转换库,在扩展方法方面遇到了一个奇怪的问题: namespace ClassLibrary1.DistanceTypes.Imperial.Inch { public static class DistanceTypeExtension { public static Inch Inch(this DistanceType passedDistance) { return new Inch();

我正在构建一个单位转换库,在扩展方法方面遇到了一个奇怪的问题:

namespace ClassLibrary1.DistanceTypes.Imperial.Inch
{
    public static class DistanceTypeExtension
    {
        public static Inch Inch(this DistanceType passedDistance)
        {
            return new Inch();
        }
    }
}
我正在尝试将扩展方法添加到此接口:

namespace ClassLibrary1
{
    public interface DistanceType
    {
        double ConversionFactorToStandardUnit { get; }
    }
}
在另一个类中,我有以下扩展方法:

namespace ClassLibrary1.DistanceTypes.Imperial.Inch
{
    public static class DistanceTypeExtension
    {
        public static Inch Inch(this DistanceType passedDistance)
        {
            return new Inch();
        }
    }
}
但当我尝试使用它时:

using ClassLibrary1.DistanceTypes.Imperial;
using ClassLibrary1.DistanceTypes.Imperial.Inch;

namespace ClassLibrary1
{
    [TestClass]
    public class ImperialTests
    {
        [TestMethod]
        public void ExtensionTest()
        {
            Distance d = new Distance(5, DistanceType.Inch());

            Assert.AreEqual(5, d.ToDoubleAsInches());
        }
    }
}

我得到一个错误,说DistanceType不包含英寸的定义

扩展方法是通过类型的实例调用的,我看到您直接在
类型
上调用它:

DistanceType distanceType = new DistanceType();
Distance d = new Distance(5, distanceType.Inch());

您还需要创建一个实现
DistanceType

的类。首先,您需要一些实现该接口的东西

public class ImplementsDistanceType : DistanceType ...
然后,您可以创建它的一个实例,并对其调用扩展方法

var d = new ImplementsDistanceType();
var i = d.Inch();
此外,您可能希望对在名称前面放置
I
的接口使用标准命名约定,如

public interface IDistanceType ...

扩展方法是通过类型为
DistanceType
的实例调用的,它是一个接口,因此OP需要新建一个实现它的类。是的,这也是需要的,但当前OP调用它的方式错误,但他们仍然无法执行
new DistanceType()
因为那是一个接口。@juharr同意我刚才解释了如何调用扩展方法。这个答案对Ehsan试图表达的观点提供了更多的解释。虽然接口的命名是一种观点,但我恰好同意这是一种得到强烈支持和接受的命名约定。