2011-06-10 2 views
2

DataTableColumn 클래스의 배열을 만들려고하지만 불행히도 나는 그걸로 미치겠다. 지금으로 내가 어떤 성공하지하려고 노력 무엇실제 배열의 공분산 문제

public interface IDataTableColumn<out TValue> { 
    string Expression { get; } 
    DataTableFilterType FilterType { get; } 

    TValue Cast(string value); 
} 

public class DataTableColumn<TValue> : IDataTableColumn<TValue> { 
    public DataTableColumn(string expression, DataTableFilterType filterType = DataTableFilterType.Equal) { 
     Expression = expression; 
     FilterType = filterType; 
    } 

    public string Expression { get; private set; } 
    public DataTableFilterType FilterType { get; private set; } 

    public TValue Cast(string value) { 
     return value.As<TValue>(); 
    } 
} 

private readonly IDataTableColumn<object>[] _columns = { 
    new DataTableColumn<int>("Id"), // ERROR 
    new DataTableColumn<string>("Description", DataTableFilterType.StartsWith), // SUCCESS 
    new DataTableColumn<DateTime?>("Date"), // ERROR 
}; 
사실

private readonly dynamic[] _columns = { 
    new DataTableColumn<int>("Id"), 
    new DataTableColumn<string>("Description", DataTableFilterType.StartsWith), 
    new DataTableColumn<DateTime?>("Date"), 
}; 

처럼 작동처럼 내 배열은 내가 사용 동적 아니라고 생각 있어야한다 그렇게하는 가장 좋은 방법은 .. 누군가가 빛을 비춰주게!

편집

빌어 먹을 나는 '> 암시 IDataTableColumn < 객체 에'유형 DataTableColumn < INT>를 변환 할 수 없습니다 오류

를 잊어 버렸습니다. 명시 적 변환은 (당신 이 캐스트를 누락?) 존재

암시 유형 DataTableColumn < System.DateTime를 변환 할 수 없습니다? > '에서 'IDataTableColumn < 개체> '로 변경하십시오. 명시 적 변환은 (당신 이 캐스트를 누락?)

+1

어떤 오류가 발생합니까? –

답변

4

내가 intDateTime과 함께 공변되지 않는 값 형식이기 때문에 그것을 믿고 존재 object (그들은 복싱이 필요).

covar.cs(23,13): error CS0266: Cannot implicitly convert type 
    'DataTableColumn<System.DateTime>' to 'IDataTableColumn<object>'. 
    An explicit conversion exists (are you missing a cast?) 

Per MSDN, "Variance in Generic Interfaces (C# and Visual Basic)" : 일반적인 인터페이스에

차이가 참조 형식 만 지원됩니다 난 당신의 코드를 컴파일 할 때 다음과 같은 오류가 발생합니다. 값 유형은 분산을 지원하지 않습니다. 예를 들어, 정수가 값 형식으로 표시되기 때문에 IEnumerable<int> (Visual Basic의 경우 IEnumerable(Of Integer))을 암시 적으로 IEnumerable<object> (Visual Basic의 경우 IEnumerable(Of Object))으로 변환 할 수 없습니다.

DataTableColumn<string>은 직접 object에서 파생 되었기 때문에 작동합니다.

+0

그런 식으로 할 방법이 없습니까? 아무도 접근? –

+2

@Kim, 대답은 대개 'IFoo '이'IFoo'에서 파생 된 다음 배열의 유형이'IFoo'가되도록합니다. 공분산은 * 참조 유형 *에서 작동하므로 오류가 발생합니다. –

+0

좋아, 모두들, 나는 문제의 원인이 아니라 내 문제에 대한 '대답'을 찾기 위해 여기에서 노력하고 있습니다. 어쨌든 고마워. –